Я выполняю запрос, который производит план:
Статистика 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. Один «рабочий файл» означает ровно одну таблицу, которая используется для одной цели?
Если есть больше, чем один рабочий файл / рабочий стол, то я не могу знать, для какой операции он используется?