Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

निष्पादन योजना में सॉर्ट ऑपरेटर को हटाकर SQL प्रश्नों को अनुकूलित करना

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

यह एक अति-सामान्यीकरण है। अक्सर, एक सॉर्ट-ऑपरेटर को मामूली रूप से इंडेक्स में ले जाया जा सकता है, और, यदि परिणाम सेट की केवल पहली दो पंक्तियां प्राप्त की जाती हैं, तो क्वेरी लागत को काफी हद तक कम कर सकती है, क्योंकि डेटाबेस को अब सभी मिलान पंक्तियों को लाने की आवश्यकता नहीं है (और उन्हें सॉर्ट करें all) पहले वाले को खोजने के लिए, लेकिन परिणाम सेट क्रम में रिकॉर्ड पढ़ सकते हैं, और पर्याप्त रिकॉर्ड मिलने के बाद बंद कर सकते हैं।

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

अब, यदि आप अभी भी उस सॉर्ट-ऑपरेटर से छुटकारा पाना चाहते हैं, तो आप कोशिश कर सकते हैं:

SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] in (0, 1)
ORDER BY [Phone]    

वैकल्पिक रूप से, आप निम्न अनुक्रमणिका आज़मा सकते हैं:

CREATE NONCLUSTERED INDEX IX_Store ON dbo.[Store]([ParentStoreId], [Phone], [Type])

ParentStoreId . पर इंडेक्स रेंज स्कैन करने के लिए क्वेरी ऑप्टिमाइज़र प्राप्त करने का प्रयास करने के लिए केवल, फिर अनुक्रमणिका में सभी मिलान पंक्तियों को स्कैन करें, यदि Type . तो उन्हें आउटपुट करें मैच। हालांकि, इससे अधिक डिस्क I/O होने की संभावना है, और इसलिए आपकी क्वेरी को गति देने के बजाय धीमा कर दें।

संपादित करें :अंतिम उपाय के रूप में, आप उपयोग कर सकते हैं

SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] = 0
ORDER BY [Phone]

UNION ALL

SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND [Type] = 1
ORDER BY [Phone]

के साथ

CREATE NONCLUSTERED INDEX IX_Store ON dbo.[Store]([ParentStoreId], [Type], [Phone])

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Linux से SQL सर्वर से कनेक्ट करने में विफलता

  2. SQL अधिकतम (दिनांक) और संबंधित मान का चयन करें

  3. SQL सर्वर प्रबंधन स्टूडियो (SSMS) के साथ डेटाबेस डिज़ाइन सीखें - भाग 2

  4. SQL सर्वर (T-SQL) में किसी दिनांक से सप्ताह संख्या निकालें

  5. SQL में पंक्ति को क्लोन करने का सबसे तेज़ तरीका