Menurut definisi (setidaknya dari apa yang saya lihat) sargable berarti bahwa kueri mampu membuat mesin kueri mengoptimalkan rencana eksekusi yang digunakan kueri. Saya sudah mencoba mencari jawabannya, tetapi sepertinya tidak banyak tentang masalah ini. Jadi pertanyaannya adalah, apa yang membuat atau tidak membuat query SQL sargable? Dokumentasi apa pun akan sangat dihargai.
Untuk referensi: SARGable
sql-server
performance
DForck42
sumber
sumber
Jawaban:
Hal paling umum yang akan membuat kueri tidak dapat dinyalakan adalah menyertakan bidang di dalam fungsi di mana klausa:
Pengoptimal SQL tidak dapat menggunakan indeks pada myDate, bahkan jika ada. Ini benar-benar harus mengevaluasi fungsi ini untuk setiap baris tabel. Jauh lebih baik untuk digunakan:
Beberapa contoh lain:
sumber
GROUP BY
penyebab permintaan menjadi tidak dapat ditagih?WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))
menjadiSELECT... FROM ... WHERE FullName = 'Ed Jones' UNION SELECT...FROM...WHERE FullName IS NULL
? Saya pernah diberitahu oleh seorang pria optimasi yang menggunakan ATAU di mana klausa dapat membatalkan permintaan ..?Select ... WHERE isNull(FullName,'Ed Jones') = 'Ed Jones'
danSelect ... WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))
. Keduanya menggunakan indeks pada FullName dan melakukan pencarian indeks.Jangan lakukan ini:
Itu menyebabkan pemindaian tabel / indeks, karena nilai LIKE dimulai dengan karakter wildcard.
Jangan lakukan ini:
Itu menyebabkan pemindaian tabel / indeks.
Server database harus mengevaluasi FUNGSI () terhadap setiap baris dalam tabel dan kemudian membandingkannya dengan 'BLAH'.
Jika memungkinkan, lakukan secara terbalik:
Ini akan menjalankan INVERSE_FUNCTION () terhadap parameter sekali dan masih akan memungkinkan penggunaan indeks.
sumber
Dalam jawaban ini saya berasumsi bahwa basis data memiliki cukup indeks cakupan. Ada cukup banyak pertanyaan tentang topik ini .
Banyak kali sargabilitas kueri ditentukan oleh titik kritis indeks terkait. Titik kritis mendefinisikan perbedaan antara mencari dan memindai indeks saat bergabung dengan satu tabel atau hasil yang ditetapkan ke yang lain. Satu pencarian tentu saja jauh lebih cepat daripada memindai seluruh tabel, tetapi ketika Anda harus mencari banyak baris, pemindaian bisa lebih masuk akal.
Jadi antara lain pernyataan SQL lebih mahal ketika optimizer mengharapkan jumlah baris yang dihasilkan dari satu tabel menjadi kurang dari titik kritis indeks yang mungkin pada tabel berikutnya.
Anda dapat menemukan pos dan contoh terperinci di sini .
sumber
Untuk suatu operasi yang dianggap sargable, tidaklah cukup baginya untuk hanya dapat menggunakan indeks yang ada. Dalam contoh di atas, menambahkan pemanggilan fungsi terhadap kolom yang diindeks di mana klausa, kemungkinan besar masih akan mengambil keuntungan dari indeks yang ditentukan. Ini akan "memindai" alias mengambil semua nilai dari kolom itu (indeks) dan kemudian menghilangkan yang tidak cocok dengan nilai filter yang disediakan. Masih belum cukup efisien untuk tabel dengan jumlah baris yang tinggi. Yang benar-benar mendefinisikan sargability adalah kemampuan kueri untuk menelusuri indeks b-tree menggunakan metode pencarian biner yang bergantung pada setengah-set eliminasi untuk array item yang diurutkan. Dalam SQL, itu akan ditampilkan pada rencana eksekusi sebagai "indeks pencarian".
sumber