После создания базы данных tpch в моем SQL Server, я попробовал следующий запрос:
set statistics io on
DBCC DROPCLEANBUFFERS;
select top 100 * from dbo.lineitem order by l_partkey;
Элемент таблицы line имеет некластеризованный индекс для l_partkey. Я выполнил вышеупомянутые запросы несколько раз и обнаружил, что логические чтения меняются каждый раз:
Table 'lineitem'. Scan count 1, logical reads 1019, physical reads 4, read-ahead reads 1760, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'lineitem'. Scan count 1, logical reads 1007, physical reads 4, read-ahead reads 1720, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'lineitem'. Scan count 1, logical reads 1030, physical reads 4, read-ahead reads 1792, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Из поста здесь: Количество логических чтений варьируется , я знаю, что это может быть вызвано поведением с опережением чтения.
НО именно почему чтение вперед может вызвать больше логических чтений? Как это меняет поведение SQL Server? Как SQL Server может читать больше индексной страницы, так как она в любом случае находится в кеше?
Во всяком случае, я отключил чтение вперед и снова выполнить вышеуказанный запрос. Теперь он сообщает одинаковое количество логических чтений каждый раз. НО логические чтения намного меньше !!
Table 'lineitem'. Scan count 1, logical reads 404, physical reads 160, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Поэтому мой вопрос заключается в том, почему функция опережающего чтения может привести к большему количеству логических операций чтения?
Из любопытства я попробовал другой запрос без "order by":
select top 100 * from dbo.lineitem
Вот результат без чтения вперед:
Table 'lineitem'. Scan count 1, logical reads 5, physical reads 3, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Вот результат с прочитанным впереди:
Table 'lineitem'. Scan count 1, logical reads 15, physical reads 2, read-ahead reads 3416, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
У того, кто читает вперед, еще больше логических чтений. Итак, почему?