Setelah membuat database tpch di SQL Server saya, saya mencoba permintaan di bawah ini:
set statistics io on
DBCC DROPCLEANBUFFERS;
select top 100 * from dbo.lineitem order by l_partkey;
Tableitem tabel memiliki indeks non-clustered di l_partkey. Saya mengeluarkan pertanyaan di atas untuk beberapa kali dan menemukan bahwa pembacaan logis bervariasi setiap kali:
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.
Dari pos di sini: Hitungan baca logis bervariasi , saya tahu itu bisa disebabkan oleh perilaku baca depan.
TETAPI mengapa membaca ke depan dapat menyebabkan lebih banyak membaca logis? Bagaimana cara mengubah perilaku SQL Server? Seperti SQL Server dapat membaca lebih banyak halaman indeks karena itu masih dalam cache?
Lagi pula, saya menonaktifkan baca sebelumnya dan mengeluarkan pertanyaan di atas lagi. Sekarang ia melaporkan jumlah pembacaan logis yang sama setiap kali. TETAPI bacaan logisnya jauh lebih kecil !!
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.
Jadi pertanyaan saya adalah, mengapa fitur baca depan dapat menyebabkan lebih banyak dan beragam jumlah pembacaan logis?
Karena penasaran, saya mencoba kueri lain tanpa "pesanan oleh":
select top 100 * from dbo.lineitem
Inilah hasilnya tanpa membaca dulu:
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.
Inilah hasilnya dengan membaca sebelumnya:
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.
Yang dengan baca depan masih memiliki lebih banyak membaca logis. Jadi kenapa?