अच्छा, बुरा या उदासीन: जहां 1 = 1


14

Reddit पर इस प्रश्न को देखते हुए , मैंने क्वेरी को साफ़ करने के लिए कहा कि मुद्दा क्वेरी में कहाँ था। मैं पहले कॉमा का उपयोग करता हूं और WHERE 1=1प्रश्नों को संशोधित करना आसान बनाता हूं, इसलिए मेरे प्रश्न आमतौर पर इस तरह समाप्त होते हैं:

SELECT 
     C.CompanyName
    ,O.ShippedDate
    ,OD.UnitPrice
    ,P.ProductName
FROM 
               Customers       as C
    INNER JOIN Orders          as O  ON C.CustomerID = O.CustomerID
    INNER JOIN [Order Details] as OD ON O.OrderID    = OD.OrderID
    INNER JOIN Products        as P  ON P.ProductID  = OD.ProductID
Where 1=1
--  AND O.ShippedDate Between '4/1/2008' And '4/30/2008'
    And P.productname = 'TOFU'
Order By C.CompanyName

किसी ने मूल रूप से कहा कि 1 = 1 आम तौर पर प्रदर्शन के लिए आलसी और बुरा है

यह देखते हुए कि मैं "समय से पहले अनुकूलन" नहीं करना चाहता - मैं अच्छी प्रथाओं का पालन करना चाहता हूं। मैंने क्वेरी योजनाओं को पहले देखा है, लेकिन आम तौर पर केवल यह पता लगाने के लिए कि मैं अपने प्रश्नों को और तेज़ करने के लिए किन इंडेक्सों को जोड़ (या समायोजित) कर सकता हूं।

सवाल तो वास्तव में ... क्या Where 1=1बुरा होने का कारण बनता है? और यदि हां, तो मैं कैसे बता सकता हूं?

माइनर एडिट: मैंने हमेशा 'ग्रहण' किया है और साथ ही साथ 1=1इसे अनुकूलित किया जाएगा, या सबसे कम नगण्य होगा। कभी भी किसी मंत्र पर सवाल उठाने की जुर्रत नहीं करता, जैसे "गोटो के ईविल" या "प्रीमेच्योर ऑप्टिमाइज़ेशन ..." या अन्य ग्रहण किए गए तथ्य। यकीन नहीं था कि 1=1 ANDक्या वास्तविक रूप से क्वेरी योजनाओं को प्रभावित करेगा या नहीं। उप-क्षेत्रों में क्या है? CTE के? प्रक्रिया?

मैं अनुकूलन करने के लिए एक नहीं हूं, जब तक कि जरूरत न हो ... लेकिन अगर मैं कुछ ऐसा कर रहा हूं जो वास्तव में "बुरा" है, तो मैं उन प्रभावों को कम करना चाहूंगा या जहां लागू हो सकता हूं।


2
नहीं, यह नहीं होगा। आशावादी के लिए कुछ माइक्रोसेकंड के अलावा अनावश्यक स्थिति को दूर करने के लिए। आप अपनी तिथि शाब्दिक रूप से अस्पष्ट नहीं होने पर बेहतर ध्यान केंद्रित करते हैं।
ypercube y

जैसा कि @ypercube ने कहा, इससे कोई फर्क नहीं पड़ता। क्वेरी ऑप्टिमाइज़र को किसी भी तरह से कोई फर्क करने के लिए **** का एक टुकड़ा होना चाहिए;)
फिलो

4
विश्वास मत करो कि तुम सब कुछ reddit पर पढ़ें। कृप्या।
आरोन बर्ट्रेंड

1
@AaronBertrand मैं नमक के एक दाने के साथ सब कुछ लेता हूं, जब तक कि मैंने इसे पहले हाथ का अनुभव नहीं किया। मैं अब भी एक सवाल उठाऊंगा जो सुनने में आसान लगता है और देखें कि क्या इसमें कोई सच्चाई है, खासकर जब यह मेरे दिन-प्रतिदिन की नौकरी को प्रभावित करता है।
वर्नरसीडी

4
नमक के दाने हैं, तो आपके कार्यालय की इमारत के ऊपर डंप किए गए एक पूरे समुद्र की नमक सामग्री है: P
Phil13

जवाबों:


13

SQL सर्वर पार्सरऑप्टिमाइज़र में "कॉन्स्टेंट फोल्डिंग" नामक एक सुविधा होती है जो क्वेरी से टॉटोलॉजिकल अभिव्यक्तियों को समाप्त करती है।
यदि आप निष्पादन योजना को देखते हैं, तो कहीं भी विधेय में आप देखेंगे कि अभिव्यक्ति दिखाई देती है। इसका तात्पर्य यह है कि इस और अन्य कारणों से संकलन समय पर निरंतर तह किया जाता है और क्वेरी प्रदर्शन पर इसका कोई प्रभाव नहीं पड़ता है।

अधिक जानकारी के लिए कार्डिनैलिटी अनुमान के दौरान लगातार तह और अभिव्यक्ति का मूल्यांकन देखें ।


यह शायद संकलित है क्योंकि यह खेतों को समतल करने के लिए एक ज्ञात पैटर्न है।
jcolebrand

नहीं, यह दूर संकलित है क्योंकि यह तांत्रिक है। यह 2736 = 2736 के साथ उसी तरह से काम करेगा, जो हमेशा की तरह 1 = 1. नहीं है, यही विरोधाभासों पर भी लागू होता है। उस स्थिति में सुविधा को "विरोधाभास का पता लगाने" कहा जाता है।
स्पेगेटिडिबा

"ज्ञात पैटर्न" के किस भाग का अर्थ "1 = 1" होना है?
jcolebrand

9

निरर्थक विधेय के अतिरिक्त SQL सर्वर में अंतर कर सकते हैं।

नीचे दिए गए निष्पादन योजनाओं @1में पहली योजना बनाम 'foo'दूसरी योजना में शाब्दिक सूचना है ।

यहाँ छवि विवरण दर्ज करें

यह इंगित करता है कि SQL सर्वर ने पहली क्वेरी के लिए विचार किया निष्पादन योजना के पुन: उपयोग को बढ़ावा देने के सरल पैरामीटर के - हालांकि दो स्थिरांक की तुलना दूसरे मामले में होने से रोकती है।

शर्तों की एक सूची जो सरल पैरामीटराइजेशन को रोकती है (जिसे पहले ऑटो-पैरामीटराइजेशन के रूप में जाना जाता है) को Microsoft तकनीकी पत्रों के कैशिंग प्लान के परिशिष्ट A में पाया जा सकता है:

साधारण मापदण्ड आमतौर पर कुछ भी नहीं है जो आपको वैसे भी भरोसा करना चाहिए। स्पष्ट रूप से अपने प्रश्नों को स्पष्ट करना बेहतर है।


4

किसी भी आधुनिक RDBMS में (Oracle सहित, Microsoft SQL Server और PostgreSQL - मुझे यकीन है कि इनके बारे में) इसका प्रदर्शन पर कोई प्रभाव नहीं पड़ेगा।

जैसा कि किसी ने उल्लेख किया है, यह केवल क्वेरी प्लानिंग चरण को प्रभावित करेगा। इसलिए अंतर केवल तब दिखाई देगा जब आप एक सरलीकृत क्वेरी के हजारों पुनरावृत्तियों को चलाते हैं जो किसी भी डेटा को वापस नहीं करता है, जैसे कि यह:

SELECT 1 FROM empty_table; -- run this 10 000 times.

SELECT 1 FROM empty_table WHERE 1=1; -- run this 10 000 times and compare.

मेरे लिए, PostgreSQL 9.0 पर, यह केवल 10000 पुनरावृत्तियों के साथ दिखाई दे रहा है:

filip@srv:~$ pgquerybench.pl -h /var/run/postgresql/ -q "select 1 from never where 1=1" -q "select 1 from never" -i 10000
Iterations: 10000
Query:   select 1 from never where 1=1
Total:   2.952 s
Average: 0.295 ms
Query:   select 1 from never
Total:   2.850 s
Average: 0.285 ms

0

यह Oracle के लिए "समस्या" हो सकता है जब आप डेटाबेस पैरामीटर कर्सर_शेयरिंग का उपयोग करते हैं। जब इसे "बल" पर सेट किया जाता है, तो यह सभी SQL स्टेटमेंट को संशोधित करेगा। प्रश्नों में सभी "स्थिरांक" को बाइंड चर (जैसे 1 =>: SYS_0) द्वारा प्रतिस्थापित किया जाएगा।

यह विकल्प कुछ आलसी डेवलपर्स से निपटने के लिए पेश किया गया था। दूसरी ओर यह अन्य आलसी डेवलपर्स को भी नुकसान पहुंचा सकता है। लेकिन जोखिम बहुत अधिक नहीं है। 11 जी के बाद से इसमें वेरिएबल पीकिंग फीचर है।


क्या आप स्पष्ट कर सकते हैं कि "11g के बाद से इसमें वेरिएबल पीकिंग फीचर क्या है।" माध्यम?
ypercube y

@ypercube "बाइंड वैरिएबल पीकिंग" का अर्थ है कि ऑप्टिमाइज़र बाइंड वेरिएबल्स के वास्तविक मानों का निरीक्षण करेगा और क्वेरी निष्पादन योजना के पुनर्मूल्यांकन और संभवतः पुन: मूल्यांकन के लिए डेटा आँकड़ों का उपयोग करेगा। मुझे संदेह है कि पीकिंग का उस निर्माण पर कोई प्रभाव पड़ेगा, जिस पर चर्चा की जा रही है, क्योंकि यह डेटा आँकड़ों पर निर्भर नहीं करता है।
२२
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.