Apakah kueri WHERE melakukan pemeriksaan pada perbandingan yang lebih sederhana (yaitu bit) sebelum menjalankan perbandingan yang lebih sulit (mis. Varchar)?

12

Jika saya menulis kueri yang menyertakan WHEREklausa majemuk , misalnya:

SELECT *
FROM MyTable
WHERE BitField = 1
    AND VarcharField = 'asdf'

dan dimasukkannya bitperbandingan itu hanya mengecualikan bidang yang sama dengan varcharperbandingan akan mengecualikan, akankah kehadiran bitperbandingan bidang itu membuat saya peningkatan kinerja?

andrewb
sumber

Jawaban:

22

Penting untuk mengenali bahwa SQL adalah bahasa deklaratif. The SELECTpermintaan Anda menulis menspesifikasikan hasil logis yang harus dikembalikan. Terserah mesin basis data, khususnya pengoptimal kueri, untuk menentukan strategi fisik yang efisien untuk mengembalikan hasil tersebut.

Rencana pelaksanaan fisik final akan tergantung pada kemampuan penalaran pengoptimal, jumlah waktu yang disiapkan untuk menghabiskan masalah, ketersediaan metode akses yang sesuai (terutama indeks dan tampilan terwujud), informasi statistik yang representatif, dan jalur kode khusus Anda spesifikasi permintaan mengambil melalui kode optimisasi.

Secara umum, jika desain database Anda bersifat relasional, Anda memberikan metode akses yang baik & informasi statistik yang akurat, dan kueri ditulis dengan baik, pengoptimal biasanya akan menemukan strategi eksekusi fisik yang wajar tanpa Anda perlu terlalu khawatir tentang bentuk tertulis dari spesifikasi permintaan terlalu banyak.

Akan selalu ada kasus di mana menyatakan persyaratan logika yang sama menggunakan sintaks yang berbeda (tetapi identik secara semantik) akan mempengaruhi rencana eksekusi fisik, tetapi itu harus menjadi perhatian sekunder. Sekali lagi, secara umum, hanya mempertimbangkan mengekspresikan kueri secara berbeda jika karakteristik runtime tidak dapat diterima, setelah semua dasar yang disebutkan di atas telah dibahas.

Jarang sekali ekstrem untuk urutan tertulis WHEREpredikat klausa konjungtif sederhana (seperti dalam pertanyaan) untuk mempengaruhi rencana eksekusi fisik dengan cara apa pun yang terukur. Singkatnya, ini bukan sesuatu yang harus Anda khawatirkan. Dapatkan desain database, indeks, dan informasi statistik terlebih dahulu.

Untuk menjawab pertanyaan secara langsung (akhirnya!), Menambahkan kondisi berlebihan yang berlebihan dapat meningkatkan kinerja, tetapi hanya jika memungkinkan penggunaan metode akses yang lebih efisien - misalnya jika hanya ada indeks pada (BitField, VarcharField). Jika sudah ada indeks pada (VarcharField), itu hanya akan menambah overhead.

Sebagai detail implementasi, tidak, SQL Server tidak mempertimbangkan biaya perbandingan tergantung pada tipe data atau kompleksitas komputasi yang jelas. Sebenarnya, ada sedikit biaya yang berharga dari operasi skalar sama sekali, tetapi itu mengarah ke topik yang terpisah.

Pertanyaan-pertanyaan Terkait:

Operator logis ATAU DAN dalam kondisi dan urutan kondisi di WHERE
SQL Server 2008 dan ekspresi konstan
Operator bitwise yang mempengaruhi kinerja
Strange SQL Statement Behavior

Paul White 9
sumber
5

Partisi biner (seperti kolom bit) terdengar seperti kandidat yang baik untuk indeks yang difilter.

CREATE NONCLUSTERED INDEX MyTableWithBitFieldTrue
ON MyTable (VarcharField)
INCLUDE Id, <other columns you're selecting>
WHERE BitField = 1 ;
GO

Menjadi eksplisit tentang optimasi Anda berarti bahwa kode Anda lebih kuat di sekitar perubahan orang lain, baik dalam basis kode Anda atau di SQL Server.

Greg
sumber