Я использую Microsoft SQL Server 2016 с пакетом обновления 2 (SP2-CU6) (13.0.5292.0) на виртуальной машине с 4 виртуальными ЦП с max degree of parallelism
установленным значением 2
и cost threshold for parallelism
установленным значением 50
.
По утрам, при попытке отобразить примерный план выполнения для запроса SELECT TOP 100 , я сталкиваюсь с массовым ожиданием, и операция рендеринга оценочного плана занимает минуты, часто раз в диапазоне 5-7 минут. Опять же, это не фактическое выполнение запроса, это всего лишь процесс отображения оценочного плана выполнения .
sp_WhoIsActive
покажет либо PAGEIOLATCH_SH
ждет, либо LATCH_EX [ACCESS_METHODS_DATASET_PARENT]
ждет, и когда я запустил сценарий Пола Рэндала WaitingTasks.sql во время операции, он показывает CXPACKET
ожидания с рабочими потоками, показывающими PAGEIOLATCH_SH
ожидания:
* поле описания ресурса = exchangeEvent id=Port5f6069e600 WaitType=e_waitPortOpen waiterType=Coordinator nodeId=1 tid=0 ownerActivity=notYetOpened waiterActivity=waitForAllOwnersToOpen
Рабочие потоки, по-видимому, переносят всю stats
таблицу в память (как эти номера страниц, так и последующие номера страниц, показанные из запроса Пола Рэндала, возвращаются к кластерному ключу для stats
таблицы). Как только план возвращается, он в основном мгновенный на оставшуюся часть дня, даже после того, как я вижу большую часть stats
истощения таблицы из кэша с оставшимися только различными записями (которые, я полагаю, были извлечены из-за операций поиска из похожих запросов).
Я ожидал бы такого начального поведения, если запрос фактически выполнялся с планом, в котором использовались операторы SCAN, но почему он делает это при оценке планов выполнения только для получения оператора SEEK, как показано в плане, связанном выше? Что я могу сделать (кроме выполнения этого оператора до рабочего дня, чтобы мои данные должным образом кэшировались), чтобы улучшить производительность здесь? Я предполагаю, что пара покрывающих индексов будет полезна, но действительно ли они гарантируют какие-либо изменения в поведении? Я должен работать в рамках некоторых ограничений окна хранения и обслуживания, и сам запрос генерируется из решения поставщика, поэтому любые другие предложения (помимо лучшей индексации) будут приветствоваться на этом этапе.