2009-09-16 11 views
15

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

मेज पर सेट नहीं है प्रश्न:

: वहाँ के बीच कोई अंतर (प्रदर्शन के लिहाज से) हो जाएगा
SELECT * FROM User where UserName='myuser' AND Application='myapp' 

और -

SELECT TOP 1 * FROM User where UserName='myuser' AND Application='myapp' 

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

कोई टिप्पणी?

धन्यवाद! एंड्री

+0

संपादन के लिए धन्यवाद, जोएल - किसी कारण से मैं कोड लाइनों के रूप में प्रश्न बनाने में सक्षम नहीं था, मैं उन्हें चुनूंगा और "कोड" आइकन पर क्लिक करूंगा और कुछ भी नहीं होगा। – Andrey

+0

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

उत्तर

10

आपको top का उपयोग करके कुछ प्रदर्शन अंतर मिल सकता है, लेकिन वास्तविक प्रदर्शन जो आपको इंडेक्स का उपयोग करके मिलता है।

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

+0

दो कॉलम पर एक इंडेक्स बनाना एक अच्छा विचार है, लेकिन मैं एक अद्वितीय इंडेक्स नहीं बनाना चाहता, क्योंकि यह आवेषण धीमा कर देगा, जो ऐप का एक महत्वपूर्ण हिस्सा है। – Andrey

+0

क्या आप जानते हैं कि इंडेक्स को अद्वितीय में स्विच करने से इंसर्ट धीमा हो जाएगा (एक गैर-अद्वितीय इंडेक्स पर) या क्या आपको संदेह है कि यह होगा? यदि आप विशिष्टता मानते हैं, तो आपको इसे एक अद्वितीय अनुक्रमणिका के साथ वापस लेना चाहिए। –

+0

एक अनूठी अनुक्रमणिका आवेषण को धीमा कर देगी क्योंकि इसे डालने से पहले अस्तित्व की जांच करनी है, लेकिन अंतर काफी छोटा होना चाहिए। आपको एक अद्वितीय इंडेक्स से कुछ बेहतर पढ़ने का प्रदर्शन मिल सकता है, लेकिन मुख्य लाभ यह है कि यह तालिका में अखंडता सुनिश्चित करता है। – Guffa

15

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

+0

यह उपयोगकर्ता नाम और एप्लिकेशन के संयोजन के रूप में हमेशा एक या कोई पंक्तियां वापस नहीं करेगा। तो क्या मैं सही ढंग से समझता हूं कि शीर्ष 1 मेरे मामले में बिल्कुल कोई फर्क नहीं पड़ेगा? – Andrey

+0

मैं "शून्य" नहीं कहूंगा। क्वेरी ऑप्टिमाइज़र जटिल चीजें हैं, इसलिए मैं वहां कुछ कमजोर शब्दों को फेंक दूंगा जैसे "शायद कोई छोटा हो"। –

+2

यह कुछ मूल्यों के लिए दुनिया में सभी अंतर करेगा, किसी के लिए कोई नहीं। जब आप उस उपयोगकर्ता और ऐप के लिए पूछते हैं जो तालिका में भौतिक क्रम में पहला होता है तो शीर्ष 1 miracoulos दिखाई देगा क्योंकि यह एक रिकॉर्ड के बाद स्कैन को रोक देगा। जब आप बी-पेड़ के अंत के पास उपयोगकर्ता और ऐप के लिए पूछते हैं तो शीर्ष 1 कोई फर्क नहीं पड़ता। आपको वास्तव में क्या चाहिए इंडेक्स को कवर करना। –

4

मुझे लगता है कि यह क्वेरी निष्पादन योजना पर निर्भर करता है जो एसक्यूएल उत्पन्न करता है ... अतीत में SQL सर्वर के पिछले संस्करणों पर मैंने कई अतिरिक्त लोगों के साथ जटिल प्रश्नों के साथ एक निश्चित 'टॉप' निश्चित प्रदर्शन लाभ का उपयोग देखा है। लेकिन निश्चित रूप से सभी मामलों में नहीं।

मुझे लगता है कि मैं सबसे अच्छी सलाह दे सकता हूं कि मामले के आधार पर इसे किसी मामले में आज़माएं।

1

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

यदि कोई अनुक्रमणिका नहीं है तो यह एक पूर्ण क्लस्टर स्कैन करेगा चाहे कोई फर्क नहीं पड़ता। शीर्ष 1 स्कैन को पहले मैच पर रोक देगा, चाहे वह 1 रिकॉर्ड प्रोसेस करने के बाद या 99 9 मिलियन प्रोसेसिंग के बाद हो। रिकॉर्ड वास्तविक उपयोगकर्ता नाम और आवेदन पर निर्भर करता है ...

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

संबंधित मुद्दे