Я выполняю запрос, который производит план:
Статистика IO:
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 128, logical reads 5952, physical reads 576, read-ahead reads 6080, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Table1'. Scan count 9, logical reads 90450, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Итак, некоторые вопросы
1. Почему статистика ввода-вывода показывает больше чтений, чем профилировщик? ,
Что касается KB314648, то все в порядке, если Профилировщик сообщает о более высоких числах, чем Статистика IO. Но Profiler показывает 92283
чтение по описанному запросу, то же самое выполнение. Означает ли это, что Profiler не учитывает чтения из рабочих файлов / рабочих таблиц?
2. В чем разница между «рабочим столом» и «рабочим файлом»
Я обнаружил, что:
- рабочие файлы могут быть использованы для хранения временных результатов для хеш-соединений и хеш-агрегатов.
- Рабочие таблицы могут использоваться для хранения временных результатов для буфера запросов, переменных lob, переменных XML и курсоров.
Есть ли какая-то физическая разница между ними?
3. Почему в данном конкретном случае есть «Рабочий стол»?
Почему у меня вообще есть рабочий стол, если есть 0 логических чтений? Он включен в статистику IO только потому, что в этом может возникнуть необходимость (в случае неверных оценок)?
Описание, найденное на Technet, кажется расплывчатым.
4. Что означает «физическое чтение» в Workfile?
Означает ли это, что для запроса недостаточно памяти, поэтому данные должны были записываться на диск во время выполнения запроса (предупреждение о совпадении хэша)? Могу ли я предположить, что всякий раз, когда я вижу рабочий стол / рабочий файл в статистическом ввод-выводе с физическим чтением, для запроса не выделяется достаточно памяти, и некоторые промежуточные результаты запроса должны быть записаны на диск tempdb? И всякий раз, когда я вижу только логическое чтение, используется ОЗУ?
5. Один «рабочий файл» означает ровно одну таблицу, которая используется для одной цели?
Если есть больше, чем один рабочий файл / рабочий стол, то я не могу знать, для какой операции он используется?
Ответы:
1. Почему статистика ввода-вывода показывает больше чтений, чем профилировщик?
Понятия не имею, извините. Часто есть различия, потому что они измеряют разные вещи, как указано в статье базы знаний. Никакой дополнительной документации по этому вопросу я не знаю. Возможно, вы сможете сделать вывод о некоторых вещах с помощью подробного тестирования, но на самом деле нет никакой гарантии, что все, что вы обнаружите, останется неизменным для разных версий и сборок. Предполагаемое поведение достаточно противоречиво, прежде чем учитывать возможные ошибки .
2. В чем разница между «рабочим столом» и «рабочим файлом»
Оба являются внутренними объектами; в противном случае это в значительной степени соответствует именам: рабочая таблица имеет табличную структуру, рабочий файл имеет файловую структуру. Подробная структура не видна, хотя некоторые широкие возможности можно определить, проверив их методы и следуя их путям выполнения с помощью отладчика.
3. Почему в данном конкретном случае есть «Рабочий стол»?
Рабочая таблица всегда нужна для операции хеширования (в режиме строки). Он используется внутри системы для распределения входных данных по хеш-разделам (перегруженный термин, не связанный с разбиением таблиц) и для отслеживания статуса. Я никогда не видел, чтобы рабочая таблица хэширования сообщала что-либо кроме нуля в выводе статистики, но тогда я действительно никогда не изучал это.
4. Что означает «физическое чтение» в Workfile?
Рабочие файлы являются частью механизма, используемого при разливе хеш-раздела. Хотя это не задокументировано, физическое чтение и чтение с опережением происходят, когда механизм выполнения извлекает разделенные хэш-разделы из рабочих файлов.
5. Один «рабочий файл» означает ровно одну таблицу, которая используется для одной цели?
Насколько я помню, может быть несколько случаев. Я не знаю, как связать конкретную
STATISTICS IO
линию с конкретным объектом или узлом плана. Это давнее ограничение. Это может быть изменение в SQL Server 2016, хотя я не проверял, применимо ли это к внутренним временным объектам.В конечном счете, по выходным данным для рабочих файлов и рабочих таблиц можно извлечь не так много,
STATISTICS IO
кроме того, что вы можете узнать, просмотрев другую информацию в плане после выполнения (или через DMV, расширенные события и т. Д.). Я прошу прощения за неполный ответ, но это лучшее, что я могу предложить из головы.источник