Munculnya set hasil yang dipesan, tanpa ORDER BY
klausa, seringkali merupakan hasil dari pemindaian baris pencarian dalam urutan indeks. Salah satu alasan mengapa pemindaian indeks-urutan umumnya dipilih di bawah READ COMMITTED
tingkat isolasi default adalah bahwa hal itu mengurangi kemungkinan anomali konkurensi yang tidak diinginkan seperti menemukan baris yang sama beberapa kali, atau sepenuhnya melewatkan beberapa baris. Ini dirinci di beberapa tempat, termasuk dalam seri artikel ini tentang tingkat isolasi.
Dengan NOLOCK
petunjuk tabel, perilaku ini santai, dan akses ke tabel dilakukan di bawah READ UNCOMMITTED
tingkat isolasi yang lebih toleran , yang dapat memindai data dalam urutan alokasi alih-alih urutan indeks. Seperti yang dijelaskan dalam tautan itu, keputusan tentang apakah akan menggunakan pemindaian alokasi atau urutan indeks diserahkan ke mesin penyimpanan. Pilihan ini dapat berubah di antara eksekusi tanpa perubahan dalam rencana kueri .
Ini mungkin terdengar sangat abstrak, tetapi dapat lebih mudah ditunjukkan dengan beberapa permintaan menggunakan fungsi tidak berdokumen terhadap database AdventureWorks2012 .
USE AdventureWorks2012;
GO
-- Appears to be ordered by BusinessEntityID
-- File:Page:Slot goes up and down several times
-- Show physical locations with sys.fn_PhysLocFormatter (undocumented)
SELECT
P.BusinessEntityID,
[(File:Page:Slot)] =
sys.fn_PhysLocFormatter(%%physloc%%)
FROM Person.Person AS P;
-- Same query with TABLOCK or NOLOCK
-- Allocation-order (IAM) scan
-- Now appears to be ordered by File:Page:Slot instead of BusinessEntityID
SELECT P.BusinessEntityID,
[(File:Page:Slot)] =
sys.fn_PhysLocFormatter(%%physloc%%)
FROM Person.Person AS P WITH (NOLOCK);
Pertanyaan dipinjam dengan sedikit modifikasi dari Paul White .
Akhirnya, hanya untuk menjadi jelas, jawaban ini adalah tentang penampilan set hasil yang dipesan. Tidak ada jaminan presentasi tanpa tingkat atas ORDER BY
.
Pemindaian urutan alokasi dapat terjadi dalam berbagai keadaan lain, seperti ketika kunci tingkat tabel diperoleh, atau database dalam mode read-only. Paralelisme juga dapat memengaruhi urutan data yang dikembalikan. Poin utamanya adalah bahwa tanpa ORDER BY
, urutan data yang dikembalikan dapat bervariasi dari waktu ke waktu menurut desain.