Агрегатный оконный оператор пакетного режима в SQL Server 2016. Продолжение
Одно из решений состоит в следующем. Мы сохраняем строчное (rowstorc), а также столбцовое (columnstore) представление данных, а право определять, какое из них больше подходит для того или иного запроса, оставляем за оптимизатором. В системе SQL Server 2016 можно в качестве основного представления данных использовать обновляемый кластеризованный индекс columnstore и в дополнение к этому иметь некластеризованные индексы двоичного дерева по той же таблице; с другой стороны, вы можете в качестве основного представления данных использовать кластеризованный индекс двоичного дерева хранилища строк rowstore и иметь к тому же обновляемый нскластеризованный индекс columnstore по той же таблице. Иными словами, два упомянутых представления данных могут сосуществовать.
Но если вам необходимо иметь только строчное представление данных и вы в то же время хотите воспользоваться преимуществами пакетной обработки, можете предпринять простой обходной маневр...
«Код скрыт в тумблерах. Перевод тумблера в одну позицию снимает блокировку. В другой позиции он открывает одну из этих дверей».
Сераф, «Матрица»
Сераф, «Матрица»
В версии SQL Server 2016 реализованы фильтрованные непастеризованные индексы columnstore. Это означает, что мы можем создать в таблице фиктивный некластеризованный индекс columnstore просто для того, чтобы сделать возможным использование операторов пакетного режима в планах по запросам к данной таблице. Приведу пример. Допустим, у нас имеется таблица T1 с целочисленным столбцом coll. Мы можем создать следующий индекс:
CREATE NONCLUSTERED COLUMNSTORE INDEX idx_cs_dummy ON dbo.T1(col1)
WHERE col1 = -1 AND col1 = -2;SQL Server обнаружит противоречие между выражениями col 1 = -1 и col 1 = -2 и с помощью оператора Constant Scan создаст в плане индекс, препятствуя фактическому доступу к данным. Таким образом, создание индекса не повлечет за собой никаких затрат и никак не скажется на быстродействии операций записи. Более того, при этом не потребуется вносить изменения в существующие запросы.
Когда такая операция будет признана уместной, SQL Server преобразует отдельные строки в пакеты и задействует в планах запросов операторы пакетного режима. В результате запросы начнут выполняться быстрее, что я и продемонстрирую далее.
Я упомянул об этом обходном маневре в разговоре с коллегой Нико Нойгебауэром, имеющим статус Data Platform MVP, который заметил, что пользуется другим приемом для достижения того же эффекта. Он использует левое внешнее объединение с фальшивым условием с пустой таблицей, располагающей индексом columnstore. Предположим, например, что у нас имеется следующий запрос к таблице Т1, которая в данный момент использует построчное представление данных:
SELECT col1, col2, col3,
SUM(col3) OVER(PARTITION BY col1) AS col1total
FROM dbo.T1;Мы создаем пустую таблицу Dummy с кластеризованным индексом columnstore:
CREATE TABLE dbo.Dummy(dummy INT NOT NULL, INDEX idx_cs CLUSTERED COLUMNSTORE);Затем мы изменяем запрос следующим образом:
SELECT col1, col2, col3,
SUM(col3) OVER(PARTITION BY col1) AS col1total
FROM dbo.T1
LEFT OUTER JOIN dbo.Dummy ON 1 = 2;Процедура выявления противоречий уведомляет систему SQL Server о том, что последней нет необходимости фактически обращаться к таблице Dummy, но наличие таблицы с индексом columnstore позволяет осуществлять пакетную обработку. Основная проблема при использовании этого метода состоит в том, что необходимо внести изменение в запрос.
Между тем достоинства применения фильтрованного индекса сводятся к тому, что его создание незатратно, а применение не снижает быстродействия операций записи и не требует внесения изменений в запросы.
Подрабатывали администратором SQL Server 2016 и разбирались во всех тонкостях агрегатного оконного оператора пакетного режима только для того, чтобы накопить необходимую сумму для игры в онлайн-казино? Что ж, в этом случае вам определенно точно придется по душе www.playsuperslots.com/casino-online/. Здесь вы сможете приумножить свой капитал, играя в слоты с самыми высокими бонусами!