Mantıksal operatörler VEYA VEYA NEREDE koşulların koşul ve şartlarında


33

Bu iki ifadeyi inceleyelim:

IF (CONDITION 1) OR (CONDITION 2)
...

IF (CONDITION 3) AND (CONDITION 4)
...

Eğer CONDITION 1DİR TRUE, olacak CONDITION 2denetlenebilir?
Eğer CONDITION 3DİR FALSE, olacak CONDITION 4denetlenebilir?

Peki ya koşullar WHERE: SQL Server motoru bir koşuldaki tüm koşulları optimize ediyor WHEREmu? Programcılar , SQL Server iyileştiricisinin doğru şekilde çözdüğünden emin olmak için koşulları doğru sıraya yerleştirmeli mi?

KATMA:

Bağlantı için Jack'e teşekkürler, t-sql kodundan şaşırtın:

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

Bu durumda , bir Sıfır İstisnası artışı yoktur .

SONUÇ:

C ++ / C # / VB kısa devre yapıyorsa, neden SQL Server'da bulunamıyor?

Buna gerçekten cevap vermek için ikisinin de şartlarla nasıl çalıştığına bir göz atalım. C ++ / C # / VB kod çalıştırma işlemini hızlandırmak için tüm dil özelliklerinde tanımlanan kısa devrelere sahiptir. Neden ilki zaten doğru olduğunda N VEYA koşullarını veya ilki zaten yanlış olduğunda M VE koşullarını değerlendirmeyi neden rahatsız etmeyin?

Geliştiriciler olarak, SQL Server'ın farklı çalıştığını bilmeliyiz. Maliyete dayalı bir sistemdir. Sorgumuz için en uygun uygulama planını elde etmek için sorgu işlemcisinin her koşulunu değerlendirmesi ve bir maliyet vermesi gerekir. Bu maliyetler daha sonra SQL Server'ın iyi bir plan için tanımladığı eşiğin altında olması gereken bir eşik değeri oluşturmak için bir bütün olarak değerlendirilir. Maliyet tanımlanmış olan eşik değerden düşükse, plan kullanılır, tüm işlem farklı koşul maliyetlerinin karışımıyla tekrar edilir. Buradaki maliyet, bir tarama veya arama veya bir birleştirme veya bir karma birleştirme vb .'dir. Bir sütunda indeksi kullanmaya zorlamanın kısa devre olarak sayıldığını düşünebilirsiniz, ancak öyle değildir. Sadece bu endeksin kullanımını zorlar ve bununla birlikte olası uygulama planlarının listesini kısaltır. Sistem hala maliyete dayalı.

Bir geliştirici olarak, SQL Server'ın diğer programlama dillerinde olduğu gibi kısa devre yapmadığını ve onu zorlamak için yapabileceğiniz bir şey olmadığını unutmayın.


Son teklif bloğu nereden geliyor? Bir referans ekleyebilir misiniz?
Nick Chammas,

Yanıtlar:


25

İfadelerin bir WHEREmaddede ya da hangi sırayla işleneceği konusunda SQL Server'da hiçbir garanti yoktur . Kısa devre ifadesine izin veren tek ifade CASE- WHEN. Stackoverflow'ta gönderdiğim bir cevaptan:

SQL Server, NEREDE durum değerlendirmesini kısa devre yapıyor

Öyle hissettiği zaman yapar, ama hemen düşündüğünüz gibi değil.

Bir geliştirici olarak, SQL Server'ın diğer programlama dillerinde olduğu gibi kısa devre yapmadığını ve onu zorlamak için yapabileceğiniz bir şey olmadığını unutmayın .

Daha fazla ayrıntı için, başka bir bloga yol açan yukarıdaki blog girişindeki ilk bağlantıyı kontrol edin:

SQL Server Kısa Devre mu?

Son karar? Aslında, henüz bir tanesine sahip değilim, ancak belirli bir kısa devreyi sağlayabileceğiniz tek sürenin, bir CASE ifadesinde birden fazla WHEN koşulunu ifade ettiğinizde olduğunu söylemek muhtemelen güvenlidir . Standart boole ifadeleriyle, optimize edici sorguladığınız tablolara, dizinlere ve verilere göre uygun gördüğü şeyleri hareket ettirir.


2
Görünüşe göre case güvenli
Jack Douglas

1
Ayrıca, CASEmolaların verildiği başka bir durumda da (ha!) Gösteriyorum
Aaron Bertrand


0

SQL, bildirimsel bir programlama dilidir. Aksine, zorunlu bir programlama dili olan C ++ deyin .

Yani sonuçta ne istediğinizi söyleyebilirsiniz , ancak sonucun nasıl yürütüldüğünü belirleyemezsiniz, hepsi motora kalmış.

İçerideki "kısa devre yaptırmayı" (veya başka bir kontrol akışını ) garanti etmenin tek gerçek yolu, WHEREindekslenmiş görünümleri, geçici tabloları ve benzeri mekanizmaları kullanmaktır.

PS. Ayrıca yürütme planı ipuçlarını da kullanabilirsiniz (motora bir sorguyu nasıl uygulayacağınızı, kullanmak için endeksleyenleri ve bunları NASIL kullanacağınızı "ipucu" olarak kullanabilirsiniz), bu konuyu kullanırken sadece bahsetmem gerektiğini düşündüm ...


-4

1) - VEYA (koşullardan herhangi biri veya her ikisi de DOĞRU olacaktır)

koşul 1 DOĞRU ise, durum 2 de kontrol edilir, DOĞRU veya YANLIŞ olabilir

--AND (her iki koşul da DOĞRU olmalıdır)

durum 1 YANLIŞ ise durum 2 kontrol edilmeyecektir


"durum 1 YANLIŞ ise, durum 2 kontrol edilmeyecektir" Bu doğru değil. Bkz yukarıdaki cevabı . SQL Server hala koşul 2'yi değerlendirebilir, çünkü WHEREcümlelerde kısa devre değerlendirmesi yapmaz .
Nick Chammas

-4

WHERE yan tümcesindeki koşulların nasıl bir araya getirileceğini denetlemenin tek yolu parantez kullanmaktır.

WHERE Col1 = 'Something' AND Col2 = 'Something' OR Col3 = 'Something' and Col4 = 'Something'

çok farklı

WHERE (Col1 = 'Something' AND Col2 = 'Something') OR (Col3 = 'Something' and Col4 = 'Something')

Sadece merak. Bu iki koşul nasıl farklı? Farklı sonuçlar, performans, yürütme planı? Eşdeğer olacağını düşündüm.
ypercubeᵀᴹ

İlki ile Col1, Col4 ve Col2 veya Col3'ü eşleştirmeniz gerekir. İkinci satırda Col1 ve Col2 ile eşleşmeniz veya Col3 ve Col4 ile eşleştirmeniz gerekir, ancak Col1 ve Col4'ün her ikisinin de birlikte değerlendirilmesi gerekmez.
mrdenny

1
Hayır hatalısın. ANDdaha yüksek önceliğe sahiptir OR. Her ikisi de eşdeğerdir. Söyledikleriniz WHERE Col1 = x AND (Col2 = x OR Col3 = x) AND Col4 = xsorgu için doğru olurdu . Bakınız SQL-Fiddle testi
ypercubeᵀᴹ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.