План выполнения, выбирающий индекс строки вместо индекса Columnstore - PullRequest
0 голосов
/ 30 марта 2020

У меня есть панель управления PowerBI, которая извлекает данные через DirectQuery из серверной таблицы SQL (назовем ее DataTable) с примерно 2 миллиардами строк и объединяет эти данные (COUNT_BIG и COUNT_BIG DISTINCT) в группы, разделенные на локализации, отображая результат в таблицу. В этой панели есть 5 разных видов фильтров. Для 3 из них существуют некластеризованные индексы строк, предназначенные исключительно для быстрого извлечения параметров фильтра, поскольку они связаны с другой таблицей (LocalizationTable). DataTable имеет кластеризованный индекс columnstore, который должен использоваться при извлечении данных, которые будут показаны в таблице.

Проблема, с которой я сталкиваюсь, заключается в том, что в зависимости от состояния фильтров выбранный план выполнения для извлечения данных из DataTable использует один из некластеризованных индексов строк вместо кластеризованного индекса columnstore, который заставляет запрос занимать много времени, чтобы получить результаты.

Например, если я выберу указанную c локализацию и выберу период 37 дней, я получу следующий План выполнения.

План выполнения на период 37 дней

Но если я выберу ту же локализацию с периодом 38 дней, я получу правильный план выполнения, как показано ниже.

План выполнения на период 38 дней

Я пытался создать визуализацию, заставляя индекс columnstore для DataTable и затем подключался к PowerBI, но это делало фильтр неэффективным, занимая много времени (даже если они вообще загружались) .

Анализируя статистику по Плану выполнения, я заметил, что для разных комбинаций периодов времени существовала разница в оценочной стоимости оператора для ключа Lookup в неверном плане выполнения, в то время как это значение в Сканирование индекса Columnstore в правильном плане выполнения оставалось постоянным. Правильный план выполнения будет выбран только после того, как стоимость поиска ключей превысит стоимость сканирования Columnstore.

Статистика этих периодов приведена ниже.

Rowstore vs Columnstore на период 37 дней

Rowstore vs Columnstore на период 38 дней

Obs: стрелки указывают, какой индекс был выбран.

Поскольку PowerBI DirectQuery не позволяет вам редактировать запросы (не то, что я знаю), я мог бы действительно использовать какое-то внешнее мнение о том, что делать, чтобы оптимизировать выполнение запросов.

...