Pengguna SQL Server menggunakan istilah "sargable" . Saya bertanya-tanya apakah ada definisi abadi agnostik implementasi-agnostik objektif untuk "sargable."
Misalnya, WHERE foo LIKE '%bar%'
dikatakan oleh banyak orang tidak murah , tetapi beberapa RDBMS dapat menggunakan indeks pada permintaan tersebut . Apa artinya "tidak mahal" ?
Referensi Lainnya
terminology
Evan Carroll
sumber
sumber
Jawaban:
Istilah "sargable" pertama kali diperkenalkan oleh P. Griffiths Selinger et al. dalam makalah mereka tahun 1979 "Jalur Akses Seleksi dalam Sistem Manajemen Database Relasional", yang diterbitkan oleh ACM . Untuk anggota non-ACM ada salinan makalah itu di http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf
Istilah ini didefinisikan dalam paragraf ini:
Dengan kata lain, predikat sargable adalah sedemikian rupa sehingga dapat diselesaikan oleh mesin penyimpanan (metode akses) dengan secara langsung mengamati tabel atau catatan indeks. Sebaliknya, predikat non-sargable membutuhkan tingkat DBMS yang lebih tinggi untuk mengambil tindakan. Sebagai contoh, hasil dari
WHERE lastname = 'Doe'
dapat diputuskan oleh mesin penyimpanan dengan hanya melihat isi bidanglastname
setiap catatan. Di sisi lain,WHERE UPPER(lastname) = 'DOE'
memerlukan eksekusi fungsi oleh mesin SQL, yang berarti mesin penyimpanan harus mengembalikan semua baris yang dibacanya (asalkan cocok dengan predikat lain yang mungkin, yang dapat ditagih) kembali ke mesin SQL untuk evaluasi, menimbulkan biaya CPU tambahan .Anda dapat melihat dari definisi asli bahwa predikat sargable dapat berlaku tidak hanya untuk pemindaian indeks, tetapi juga untuk pemindaian tabel (segmen dalam terminologi Sistem R), selama syarat "perbandingan kolom-nilai operator" terpenuhi dan karenanya dapat dievaluasi oleh mesin penyimpanan. Ini memang kasus dengan Db2, keturunan Sistem R dalam banyak hal :
Fakta bahwa dalam predikat SQL Server-Speak sargable hanya mereka yang dapat diselesaikan menggunakan indeks berusaha mungkin ditentukan oleh ketidakmampuan mesin penyimpanannya untuk menerapkan predikat tersebut selama scan tabel.
Predikat Sargable dan non-sargable kadang-kadang digambarkan sebagai predikat "stage 1" dan "stage 2" (ini juga berasal dari terminologi Db2 ). Predikat tahap 1 dapat dievaluasi pada tingkat terendah dari pemrosesan kueri, saat membaca tabel atau catatan indeks. Baris yang cocok dengan kondisi tahap 1, jika ada, dikirim ke tingkat berikutnya, tahap 2, evaluasi.
1 - Segmen dalam Sistem R adalah penyimpanan fisik tupel tabel; pemindaian segmen agak setara dengan pemindaian tabel di DBMS lainnya.
2 - RSI - RSS 3 Interface, antarmuka permintaan berorientasi tuple. Fungsi antarmuka yang relevan dengan diskusi ini adalah NEXT, yang mengembalikan predikat permintaan pencocokan baris berikutnya.
3 - RSS, atau Research Storage System, subsistem penyimpanan System R.
sumber
= UPPER()
adalah panggilan fungsi, tetapi begitu jugamemcmp
dengan sendirinya. Akan relatif mudah untuk menulismemcmp
yang mengasumsikan ASCII dan mengabaikan case (lihat saja gigitan kedua). Apakah itu membuatnya TERGANGGU? Lihat juga contoh @ Ypercube, dba.stackexchange.com/questions/162263/…x=0
SARGable? Bagaimana dengan-0 = +0
,' ' = ''
atau kesetaraan spasial? Apa yang akan menjadi contoh dari sesuatu yang SARGable, pasti? Ketika Anda mengatakan "tanpa bantuan fungsi database diimplementasikan di luar mesin penyimpanan" Anda termasuk dalam contoh YpercubeDATE()
yang termasuk di dalam mesin penyimpanan. Mengapa itu tidak dapat dilakukan dengan sendirinya?DATE()
bukan fungsi (SQL Server) nyata, tapi (saya kira) singkatan Mr Cube untuk konversi tipe. Kami juga dapat mendiskusikan hal ini dalam obrolan jika Anda mau.Bagi saya, SARGable berarti SQL Server dapat melakukan pencarian indeks menggunakan predikat pencarian Anda.
Anda tidak bisa hanya mengatakan bahwa DBMS dapat "mengambil keuntungan" dari suatu indeks, karena dengan predikat non-sargable, SQL Server dapat akhirnya memindai indeks yang tidak tercakup.
sumber
Menurut Pro SQL Server Internal oleh Dmitri Korotkevitch :
Contoh :
Demo :
Sekarang kita jalankan:
Hasilnya adalah:
Mari kita lihat properti dari permintaan SARGable (Index Seek)
Pengoptimal kueri dapat menentukan batas dalam indeks awal dan akhir. Ini memiliki argumen pencarian untuk ditanyakan.
Sekarang permintaan non-SARGable:
Anda dapat melihat dengan awal predikat '% non ..%' tidak memungkinkan pengoptimal kueri untuk DEFINE memulai dan mengakhiri atau kisaran dalam indeks. Sekarang harus mencari seluruh tabel (pemindaian).
sumber
WHERE name like '%non-SARGable%'
apakah itu membuat kondisinya lebih baik? Dan, jika demikian, bukankah kita berbicara tentang kelemahan implementasi tertentu? IE., Tidakkah seharusnya kita mengatakan "tidak mahal pada SQL Server 2016"WHERE DATE(datetime_column) = '2001-01-01'
misalnya adalah "sargable" (akan melakukan pencarian indeks) dalam versi SQL Server yang lebih baru (2008+ saya pikir) tetapi tidak dalam yang lebih lama.