Mari kita periksa dua pernyataan ini:
IF (CONDITION 1) OR (CONDITION 2)
...
IF (CONDITION 3) AND (CONDITION 4)
...
Jika CONDITION 1
yaitu TRUE
, akan CONDITION 2
diperiksa?
Jika CONDITION 3
yaitu FALSE
, akan CONDITION 4
diperiksa?
Bagaimana dengan kondisi pada WHERE
: apakah mesin SQL Server mengoptimalkan semua kondisi dalam WHERE
klausa? Haruskah programmer menempatkan kondisi dalam urutan yang benar untuk memastikan bahwa pengoptimal SQL Server menyelesaikannya dengan cara yang benar ?
TAMBAH:
Terima kasih kepada Jack untuk tautannya, kejutan dari kode t-sql:
IF 1/0 = 1 OR 1 = 1
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
IF 1/0 = 1 AND 1 = 0
SELECT 'True' AS result
ELSE
SELECT 'False' AS result
Tidak ada menaikkan Divide dengan pengecualian nol dalam kasus ini.
KESIMPULAN:
Jika C ++ / C # / VB memiliki hubungan arus pendek mengapa SQL Server tidak dapat memilikinya?
Untuk benar-benar menjawab ini, mari kita lihat bagaimana keduanya bekerja dengan kondisi. C ++ / C # / VB semuanya memiliki hubungan arus pendek yang ditentukan dalam spesifikasi bahasa untuk mempercepat eksekusi kode. Mengapa repot-repot mengevaluasi N ATAU kondisi saat yang pertama sudah benar atau M DAN kondisi ketika yang pertama sudah salah.
Kami sebagai pengembang harus menyadari bahwa SQL Server bekerja secara berbeda. Ini adalah sistem berbasis biaya. Untuk mendapatkan rencana eksekusi yang optimal untuk kueri kami, prosesor kueri harus mengevaluasi setiap kondisi dan menetapkan biayanya. Biaya-biaya ini kemudian dievaluasi secara keseluruhan untuk membentuk ambang batas yang harus lebih rendah dari ambang batas yang ditetapkan SQL Server untuk rencana yang baik. Jika biayanya lebih rendah dari ambang yang ditentukan maka rencana tersebut digunakan, jika tidak seluruh proses diulangi lagi dengan campuran biaya kondisi yang berbeda. Biaya di sini adalah pemindaian atau pencarian atau gabungan atau hash bergabung dll ... Karena ini hubungan arus pendek seperti yang tersedia di C ++ / C # / VB tidak mungkin. Anda mungkin berpikir bahwa memaksakan penggunaan indeks pada kolom dianggap sebagai hubungan pendek tetapi tidak. Itu hanya memaksa penggunaan indeks itu dan dengan itu mempersingkat daftar kemungkinan rencana eksekusi. Sistem ini masih berbasis biaya.
Sebagai pengembang Anda harus menyadari bahwa SQL Server tidak melakukan hubungan arus pendek seperti yang dilakukan dalam bahasa pemrograman lain dan tidak ada yang dapat Anda lakukan untuk memaksanya.