Я видел это предупреждение в планах выполнения SQL Server 2017:
Предупреждения: Операция вызвала остаточный IO [sic]. Фактическое количество прочитанных строк было (3,321,318), но количество возвращенных строк было 40.
Вот фрагмент из SQLSentry PlanExplorer:
Чтобы улучшить код, я добавил некластеризованный индекс, чтобы SQL Server мог получить доступ к соответствующим строкам. Он работает нормально, но обычно в индексе слишком много (больших) столбцов. Это выглядит так:
Если я только добавляю индекс без включаемых столбцов, это выглядит так, если я принудительно использую индекс:
Очевидно, что SQL Server считает, что поиск ключа намного дороже, чем остаточный ввод-вывод. У меня есть тестовая установка без большого количества тестовых данных (пока), но когда код запускается в производство, он должен работать с гораздо большим количеством данных, поэтому я совершенно уверен, что нужен какой-то неклассированный индекс.
Действительно ли ключевые поиски настолько дороги , что при работе на твердотельных накопителях мне приходится создавать полные индексы (с большим количеством включаемых столбцов)?
План выполнения: https://www.brentozar.com/pastetheplan/?id=SJtiRte2X Это часть длительной хранимой процедуры. Ищите IX_BatchNo_DeviceNo_CreatedUTC
.
sys.dm_exec_query_profiles
, мы переоценим его исходя из фактических затрат и расчетных). Прекратите использовать оценочный% стоимости как некоторый абсолютный показатель стоимости - это относительно, и это часто на обед.