क्या अधिक कठिन तुलना (यानी वर्चर) चलाने से पहले सरल तुलनाओं (यानी बिट) पर जांच होगी?


12

यदि मैं एक क्वेरी लिखता हूं जिसमें एक यौगिक WHEREखंड शामिल होता है, जैसे:

SELECT *
FROM MyTable
WHERE BitField = 1
    AND VarcharField = 'asdf'

और उस bitतुलना का समावेश केवल उन्हीं क्षेत्रों varcharको बाहर करता है, जो तुलना को बाहर करेगा, क्या उस bitक्षेत्र की तुलना की उपस्थिति मुझे प्रदर्शन में सुधार प्रदान करेगी ?

जवाबों:


22

यह पहचानना महत्वपूर्ण है कि एसक्यूएल एक घोषणात्मक भाषा है। SELECTआपके द्वारा लिखी गई क्वेरी तार्किक परिणाम निर्दिष्ट करती है जिन्हें वापस किया जाना चाहिए। यह डेटाबेस इंजन पर निर्भर है, विशेष रूप से क्वेरी ऑप्टिमाइज़र, उन परिणामों को वापस करने के लिए एक कुशल शारीरिक रणनीति निर्धारित करने के लिए।

अंतिम भौतिक निष्पादन योजना ऑप्टिमाइज़र की तर्क क्षमता, समस्या पर खर्च करने के लिए तैयार समय की मात्रा, उपयुक्त पहुंच के तरीकों की उपलब्धता (मुख्य रूप से अनुक्रमित और भौतिक विचार), प्रतिनिधि आँकड़े जानकारी और विशेष कोड पथ पर निर्भर करेगा। क्वेरी विनिर्देश अनुकूलन कोड के माध्यम से लेता है।

सामान्य तौर पर, यदि आपका डेटाबेस डिजाइन संबंधपरक है, तो आप अच्छी पहुंच के तरीके और सटीक सांख्यिकीय जानकारी प्रदान करते हैं, और क्वेरी अच्छी तरह से लिखी गई है, आशावादी को सामान्य रूप से एक उचित शारीरिक निष्पादन रणनीति मिल जाएगी, जिसके बिना आपको लिखित रूप के बारे में बहुत अधिक चिंता करने की आवश्यकता नहीं है। क्वेरी विनिर्देश बहुत अधिक है।

हमेशा ऐसे मामले होंगे जहां विभिन्न (लेकिन शब्दार्थ समान) सिंटैक्स का उपयोग करके एक ही तर्क की आवश्यकता को व्यक्त करना शारीरिक निष्पादन योजना को प्रभावित करेगा, लेकिन यह एक माध्यमिक चिंता का विषय होना चाहिए। फिर, आम तौर पर, केवल क्वेरी को अलग तरीके से व्यक्त करने पर विचार करें यदि रनटाइम विशेषताएँ अस्वीकार्य हैं, एक बार ऊपर उल्लिखित सभी मूल बातें कवर की गई हैं।

यह WHEREकिसी भी औसत दर्जे की शारीरिक निष्पादन योजना को प्रभावित करने के लिए सरल संयुग्मक खंड के लिखित आदेश (प्रश्न के अनुसार) के लिए चरम में दुर्लभ होगा । संक्षेप में, यह कोई ऐसी चीज नहीं है जिसके बारे में आपको चिंता करने में समय बिताना चाहिए। डेटाबेस डिजाइन, इंडेक्स और सांख्यिकीय जानकारी पहले प्राप्त करें।

सीधे (अंततः!) सवाल का जवाब देने के लिए, अतिरिक्त अतिरेक स्थिति को जोड़ने से प्रदर्शन में सुधार हो सकता है , लेकिन केवल अगर यह एक अधिक कुशल पहुंच विधि का उपयोग करने में सक्षम बनाता है - उदाहरण के लिए यदि केवल एक सूचकांक (बिटफिल्ड, वर्चफिल्ड) है। यदि पहले से ही (VarcharField) पर एक इंडेक्स था, तो यह केवल ओवरहेड जोड़ देगा।

कार्यान्वयन विवरण के रूप में, नहीं, SQL सर्वर डेटा प्रकार या स्पष्ट कम्प्यूटेशनल जटिलता के आधार पर तुलना की लागत पर विचार नहीं करता है। वास्तव में, सभी में अदिश संक्रियाओं की कीमती कीमत कम होती है , लेकिन यह एक पूरे अलग विषय की ओर ले जाता है।

संबंधित सवाल:

तार्किक ऑपरेटर या जहां हालत में और शर्तों के क्रम में
SQL Server 2008 और निरंतर अभिव्यक्तियाँ
बिटवाइज़ ऑपरेटर प्रदर्शन को प्रभावित करते हैं
अजीब एसक्यूएल स्टेटमेंट


5

फ़िल्टर किए गए अनुक्रमित के लिए अच्छे उम्मीदवारों की तरह द्विआधारी विभाजन (एक बिट कॉलम की तरह) ध्वनि।

CREATE NONCLUSTERED INDEX MyTableWithBitFieldTrue
ON MyTable (VarcharField)
INCLUDE Id, <other columns you're selecting>
WHERE BitField = 1 ;
GO

आपके अनुकूलन के बारे में स्पष्ट होने का मतलब है कि आपका कोड अन्य लोगों के परिवर्तनों के आसपास अधिक मजबूत है, चाहे आपके कोडबेस में या SQL सर्वर में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.