क्या "जहां 1 = 1" का आमतौर पर क्वेरी प्रदर्शन पर प्रभाव पड़ता है?


19

मैंने हाल ही में प्रश्न "जहाँ 1 = 1 कथन" देखा था ; एक एसक्यूएल निर्माण जिसका उपयोग मैंने अक्सर क्लीनर कोड लिखने के प्रयास में किया है (मेजबान भाषा के दृष्टिकोण से)।

सामान्यतया, क्या यह SQL क़ानून के अलावा क्वेरी प्रदर्शन को नकारात्मक रूप से प्रभावित करता है? मैं एक विशिष्ट डेटाबेस प्रणाली के संबंध में उत्तर की तलाश नहीं कर रहा हूं (क्योंकि मैंने इसका उपयोग DB2, SQL सर्वर, MS-Access और mysql में किया है) - जब तक कि बारीकियों में आए बिना उत्तर देना असंभव नहीं है।


4
मेरा मानना ​​है कि कोई भी आशावादी ऐसी सरल स्थिति को संभालने में सक्षम होगा और बस इसे अनदेखा करेगा इसलिए अंतिम निष्पादन योजना में यह बिल्कुल नहीं होगा

मुझे भी ऐसा लगता है - तार्किक रूप से, यह समझ में आता है कि सामान्य तौर पर एक क्वेरी ऑप्टिमाइज़र बस इसे अनदेखा करेगा।

6
आप योजना की तुलना wtih और बिना1=1
Luc M

4
@ ल्यूक एम: मैंने SQLite के लिए बस इतना ही किया। यह WHILE 1=1खंड को अनुकूलित नहीं करता है । हालाँकि, इसका निष्पादन समय पर कोई पता लगाने योग्य प्रभाव नहीं है।
dan04

जवाबों:


23

सभी प्रमुख RDBMS, जहां तक ​​मुझे पता है, निरंतर मूल्यांकन में बनाया गया है। यह उनमें से किसी में भी बहुत तुरंत मूल्यांकन करना चाहिए।


+1 यह मेरा अनुमान भी रहा है, लेकिन मैंने जो सवाल पूछा उसका कारण थोड़ा और विस्तार था। मैं यह देखने के लिए थोड़ी देर खुला रखने जा रहा हूं कि मुझे कोई इनपुट मिलता है या नहीं।
ट्रांजिस्टर 1

2
इसकी अनदेखी की जाती है। यह आशावादी के साथ कुछ भी नहीं है, जहां प्रश्न में लिंक के अनुसार कॉन्डिट्यूऑन का सिर्फ कॉनैट (मेरा उत्तर भी)
gbn

8

SQL सर्वर के परिप्रेक्ष्य से यदि आप WHERE 1=1मापदंडों के डायनामिक पासिंग की अनुमति देने के लिए कर रहे हैं और किसी पैरामीटर का मूल्यांकन करने से रोक रहे हैं, तो मैं आपको SQL सर्वर MV Erland Sommarskog से कुछ लेख पढ़ने का सुझाव दूंगा। उनका दृष्टिकोण गतिशील एसक्यूएल (जैसे WHERE Column = Columnनिर्माण या निर्माण का उपयोग WHERE (Col = Val OR 1=1) and (Col2 = Val2 OR 1=1)) के अंदर कुछ अन्य चालें करने की आवश्यकता को हटाता है । 1 = 1 को प्रदर्शन के मुद्दों का कारण नहीं बनना चाहिए क्योंकि @JNK ने उल्लेख किया है (मैंने उसका जवाब वहां दिया है और यह वही है जिसे स्वीकार किया जाना चाहिए), मुझे लगता है कि आपको एर्लैंड के लेख से कुछ अच्छे सुझाव मिलेंगे गतिशील एसक्यूएल और आप यह भी देखेंगे कि वह अभी भी 1=1उन मामलों के लिए उपयोग करता है जहां कोई पैरामीटर पारित नहीं होता है, लेकिन वह उन व्यक्तिगत मापदंडों से बचता है जो पारित नहीं होते हैं, वह बस 'नहीं करता है


मैं सिर्फ दूसरा लेख ब्राउज़ कर रहा हूं (क्योंकि मैं इस समय 2008 SP1 के लिए कोड नहीं लिख रहा हूं), लेकिन मुझे लगता है कि वह अपने कोड में 1 = 1 का उपयोग कर रहा है । मैं पहले से ही sp_executesql से परिचित हूं, लेकिन वह 1 = 1, और का उपयोग करने के लिए पुश को समाप्त नहीं करता है। शायद मुझे कुछ याद आ रहा है?
ट्रांजिस्टर 1

2
+1 - एरलैंड इस तरह की चीज़ पर जाने के लिए संसाधन है।
जेएनके

बस दूसरे लिंक से उद्धृत करते हुए: "19-29 की तर्ज पर, मैं मूल एसक्यूएल स्ट्रिंग की रचना करता हूं। लाइन 29 पर स्थित शर्त 1 = 1 वहाँ है जो उपयोगकर्ताओं को किसी भी पैरामीटर को निर्दिष्ट किए बिना प्रक्रिया को कॉल करने की अनुमति देने के लिए है।"
ट्रांजिस्टर 1

2
माफ़ करना। मैंने अपनी बात गलत लिख दी। संपादित करेंगे। मेरा मतलब यह नहीं था कि जहाँ 1 = 1 के निर्माण में कोई समस्या है, बस पठनीयता के लिए अन्य सुझावों का सुझाव देना चाहिए और उम्मीद है कि WHERE (कॉलम = मान या 1 = 1) और (कॉलम 1 = मान 1 या 1 =) के दृष्टिकोण को करने से बचें। 1), आदि दृष्टिकोण।
माइक वाल्श

6

MySQL के साथ, आप वास्तविक क्वेरी को देखने के लिए विस्तृत और बाद में चल रहे जाँच कर सकते हैं। tl; dr: यह दूर अनुकूलित हो जाता है।

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
बहुत बढ़िया जवाब। Btw MySQL सर्वर v5.7.18 का कहना है कि 'EXTENDED' को पदावनत कर दिया जाता है और इसे भविष्य के रिलीज में हटा दिया जाएगा। 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 में हटा दिया गया था।
माइक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.