“NEREDE 1 = 1” genellikle sorgu performansı üzerinde bir etkiye sahip mi?


19

Geçenlerde "nerede 1 = 1 ifade" sorusunu gördüm ; bir SQL yapısı (daha çok ana bilgisayar dili açısından) daha temiz kod yazmak için dinamik SQL yapımında sık kullandım.

Genel olarak, bir SQL ifadesine yapılan bu ekleme sorgu performansını olumsuz etkiler mi? (DB2, SQL Server, MS-Access ve mysql kullandığım için) belirli bir veritabanı sistemi ile ilgili bir cevap aramıyorum - özellikleri girmeden cevaplamak mümkün değilse.


4
Herhangi bir optimize edicinin böyle basit bir durumu halledebileceğine ve basitçe görmezden gelebileceğine inanıyorum, bu yüzden nihai yürütme planı hiç içermeyecek

Ben de öyle düşünürdüm - mantıksal olarak konuşursak, genel olarak bir sorgu optimize edicisinin basitçe görmezden geldiği anlaşılıyor.

6
İcra planını ve olmadan icra planını karşılaştırabilirsiniz1=1
Luc M

4
@Luc M: Sadece SQLite için yaptım. WHILE 1=1Maddenin optimize edilmediği ortaya çıktı . Ancak, yürütme süresi üzerinde tespit edilebilir bir etkisi yok gibi görünüyor.
dan04

Yanıtlar:


23

Tüm büyük RDBMS, bildiğim kadarıyla, sürekli değerlendirmeler yapmıştır. Bu, herhangi birinde hemen hemen değerlendirmelidir.


+1 Bu benim tahminim de oldu, ama soruyu sormamın nedeni biraz daha ayrıntılı bilgi almaktı. Daha fazla girdi olup olmadığımı görmek için biraz daha açık tutacağım.
transistor1

2
Bu dikkate alınmaz. Optimize edici ile hiçbir şey değil, sadece söz konusu bağlantıya göre durumun cevabı (cevabım da)
gbn

8

Bir SQL Server Perspektifinden WHERE 1=1, parametrelerin dinamik geçişine izin vermek ve bir parametrenin değerlendirilmesini atlamak için yapıyorsanız, SQL Server MV Erland Sommarskog'dan birkaç makale okumanızı öneririz. Onun yaklaşımı, dinamik SQL içinde başka bir numara yapma ihtiyacını ortadan kaldırır ( WHERE Column = Columnyapı veya yapı kullanma gibi WHERE (Col = Val OR 1=1) and (Col2 = Val2 OR 1=1)). @JNK'nın belirttiği gibi 1 = 1 performans sorunlarına neden olmamalıdır (orada cevabını + 1'ledim ve kabul edilmesi gereken cevap budur), Erland'ın makalesinden bazı iyi ipuçları bulacağınızı düşünüyorum Dinamik SQL ve ayrıca 1=1parametrelerin geçmediği durumlar için hala onu kullandığını göreceksiniz , ancak geçmeyen bireysel parametreler için bunlardan kaçınıyor, sadece kullanmıyor '


(Şu anda 2008 SP1 için kod yazmıyorum çünkü) Ben sadece ikinci makale gezen ediyorum, ama o bkz edilir onun kodunda 1 = 1 kullanılarak. Ben zaten sp_executesql aşina, ama bu kendi içinde 1 = 1 kullanmak için itme ortadan kaldırmaz. Belki bir şey eksik?
transistor1

2
+1 - Erland bu tür şeylere giden kaynaktır.
JNK

Sadece ikinci bağlantıdan alıntı: "19-29 satırlarında, temel SQL dizesini oluşturuyorum. 29 satırındaki WHERE 1 = 1 koşulu, kullanıcıların herhangi bir parametre belirtmeden prosedürü çağırmasına izin vermek için var."
transistor1

2
Afedersiniz. Demek istediğim yanlış yazdım. Düzenleyecek. Where 1 = 1 yapısı ile ilgili bir sorun olduğunu ima etmek istemedim, sadece okunabilirlik için diğer ipuçlarını önermek ve WHERE (sütun = değer veya 1 = 1) ve (sütun1 = değer1 veya 1 = 1) vb. Yaklaşım.
Mike Walsh

6

MySQL ile, gerçek sorguyu görmek için EXPLAIN EXTENDED ve daha sonra SHOW WARS komutlarını çalıştırarak kontrol edebilirsiniz. tl; dr: optimize edilir.

mysql> use test
Database changed
mysql> create table test1(val int);
Query OK, 0 rows affected (0.19 sec)

mysql> explain extended select * from test1 where val > 11 and 1 = 1;
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | test1 | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+-------+------+--------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                    |
+-------+------+--------------------------------------------------------------------------------------------+
| Note  | 1003 | select `test`.`test1`.`val` AS `val` from `test`.`test1` where (`test`.`test1`.`val` > 11) |
+-------+------+--------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

1
Mükemmel cevap. Btw MySQL sunucusu v5.7.18, 'EXTENDED' öğesinin kullanımdan kaldırıldığını ve gelecekteki bir sürümde kaldırılacağını söylüyor. MySQL doc: In older MySQL releases, extended information was produced using EXPLAIN EXTENDED. That syntax is still recognized for backward compatibility but extended output is now enabled by default, so the EXTENDED keyword is superfluous and deprecated. Its use results in a warning, and it will be removed from EXPLAIN syntax in a future MySQL release.MySQL v 8.0 kaldırıldı.
mikep
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.