Saya mencoba untuk menyelaraskan kueri yang kami miliki di SQL Server 2014 Enterprise.
Saya telah membuka rencana kueri yang sebenarnya di SQL Sentry Plan Explorer dan saya dapat melihat pada satu simpul bahwa ia memiliki Predikat Mencari dan juga Predikat
Apa perbedaan antara Mencari Predikat dan Predikat ?
Catatan: Saya dapat melihat bahwa ada banyak masalah dengan simpul ini (misalnya baris Estimated vs Actual, IO residual), tetapi pertanyaannya tidak terkait dengan semua itu.
The Seek Predicate can be used to find the start of the RangeScan and then when to stop, while the Predicate is the "check" that is applied to every row in the Range.
Jawaban:
Mari kita lemparkan satu juta baris ke tabel temp bersama dengan beberapa kolom:
Di sini saya memiliki indeks berkerumun (secara default) pada
PK
kolom. Ada indeks nonclustered padaCOL1
yang memiliki kolom kunciCOL1
dan sertakanCOL2
.Pertimbangkan pertanyaan berikut:
Di sini saya tidak menggunakan
BETWEEN
karena Aaron Bertrand berkeliaran di pertanyaan ini.Bagaimana seharusnya pengoptimal SQL Server SQL permintaan? Yah, saya tahu bahwa filter aktif
PK
akan mengurangi hasil yang ditetapkan ke lima baris. SQL server dapat menggunakan indeks berkerumun untuk melompat ke lima baris alih-alih membaca semua juta baris dalam tabel. Namun, indeks berkerumun hanya memiliki kolom PK sebagai kolom kunci. Setelah baris dibaca ke dalam memori, kita perlu menerapkan filterCOL2
. Di sini,PK
predikat mencari danCOL2
predikat.SQL server menemukan lima baris menggunakan predikat seek dan selanjutnya mengurangi lima baris tersebut menjadi satu baris dengan predikat normal.
Jika saya mendefinisikan indeks klaster berbeda:
Dan jalankan kueri yang sama saya mendapatkan hasil yang berbeda:
Dalam hal ini, SQL Server dapat mencari menggunakan kedua kolom dalam
WHERE
klausa. Tepat satu baris dibaca dari tabel menggunakan kolom kunci.Untuk satu contoh lagi pertimbangkan pertanyaan ini:
Indeks IX_174860_IX adalah indeks penutup karena berisi semua kolom yang diperlukan untuk kueri. Namun, hanya
COL1
kolom kunci. SQL Server dapat mencari dengan kolom itu untuk menemukan 1000 baris denganCOL1
nilai yang cocok . Lebih lanjut dapat menyaring baris-baris padaCOL2
kolom untuk mengurangi hasil akhir yang ditetapkan ke 0 baris.sumber