2011-11-14 9 views
18

किसी को भी जबप्रदर्शन अंतर

int = int 

और तुलना प्रदर्शन के किसी भी ठोस सबूत प्रदान कर सकते हैं।

उदाहरण

select * 
from Samples 
where SamplesID = 5 

और के लिए:

select * 
from Samples 
where Name = 'Shampoo' 

वहाँ अंतर है या प्रदर्शन में ही है?

+1

एक नमूने की मेज पर मैं SamplesId क्लस्टर सूचकांक होने की अपेक्षा करेंगे। सूचकांक की उपस्थिति या प्रकार का भारी प्रभाव पड़ता है। क्या यह वास्तविक या सैद्धांतिक प्रश्न है? –

+0

@SteveHenderson आपकी टिप्पणी को "नमूने की प्राथमिक कुंजी होने की अपेक्षा करें" होने के लिए बदलें, और मैं आपके साथ 100% सहमत हूं :) आईडी कॉलम आमतौर पर कुंजी निर्दिष्ट करते हैं, जो क्लस्टर सूचकांक हो सकता है या नहीं भी हो सकता है। बेशक, यह सिर्फ एक धारणा है ... –

+0

@StuartAinsworth नहीं - मैं यह भी क्लस्टर सूचकांक होने की उम्मीद करता हूं। एक साधारण लुकअप टेबल (आईडी और नाम, कुछ अन्य सामानों के साथ) के साथ मैं उस लुकअप टेबल के भौतिक क्रम को आईडी (प्राथमिक कुंजी और क्लस्टर इंडेक्स) द्वारा होने की अपेक्षा करता हूं। –

उत्तर

10

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

select top 100 * from tblScratch where contactsurname = '<TestSurname>' order by NEWID() 
select top 100 * from tblScratch where contacttyperef = 1-22 order by NEWID() 

न्यूड प्रत्येक बार डेटा सूची को यादृच्छिक बनाने के लिए है। 20 उपनामों और 20 प्रकारों के लिए इसे जल्दी से चलाया। उपनाम उपनाम के बाद प्रश्नों को उपनाम चलाया गया था। संदर्भ संख्या के लिए खोज लगभग 4x तेज था और लगभग 1/2 का उपयोग किया गया था, इसलिए किताबें उन सभी वर्षों पहले ठीक थीं।

स्ट्रिंग -
SELECT TOP 100 * FROM tblScratch WHERE contactsurname = 'hoare' ORDER BY NEWID()

Duration 430ms 
Reads 902 
CPU 203 

पूर्णांक -
SELECT TOP 100 * FROM tblScratch WHERE contacttyperef = 3 ORDER BY NEWID()

Duration 136ms 
Reads 902 
CPU 79 
+0

तो इसका मतलब है कि पूर्णांक की तुलना कम CPU गहन है, इस प्रकार यह बेहतर प्रदर्शन में हल हो जाती है। माइक्रोसॉफ्ट से कोई दस्तावेज वास्तव में तुलना करता है कि तुलना वास्तव में कैसे काम करती है? –

+7

यह वास्तव में एक अच्छा परीक्षण नहीं है (क्षमा करें), और संभावित रूप से भ्रामक है क्योंकि न्यूआईडी() द्वारा ऑर्डर करने से पूरी तरह अवास्तविक तत्व प्रस्तुत होता है - यह एक GUID द्वारा पंक्तियां उत्पन्न करता है और ऑर्डर करता है। WHERE कथन की व्याख्या करने के बाद ऑप्टिमाइज़र ऐसा नहीं करेगा। क्या आप TOPID (ऑर्डर) से ऊपर और ऑर्डर ले सकते हैं और रीस्टेस्ट कर सकते हैं? –

2

अपने दोनों प्रश्नों को एक ही प्रश्न विंडो में रखें। बहुत ऊपर (इन प्रश्नों में से किसी से पहले) डाल पर: सेट सांख्यिकी आईओ पर

जब आप विकल्प के साथ कोड रन इसे चलाने के "वास्तविक निष्पादन योजना शामिल करें" (अपनी उपकरण पट्टी पर एक आइकन तीन छोटे बक्से की तरह दिखता है जो निष्पादन बटन के दाईं ओर लगभग 7 आइकन)

इसके परिणामस्वरूप आपके परिणाम में तीन टैब होंगे: परिणाम, संदेश, योजना। संदेश और योजना आपको आईओ लागत और पूर्ण निष्पादन लागत दिखाएगी।

बड़ी संख्या में क्वेरी की उच्चतम लागत है! इस विधि आप अपने आप को साबित करने के लिए अनुमति देगा जो क्वेरी है सबसे कम लागत (उच्चतम प्रदर्शन)

+1

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

2

स्टीव टिप्पणी, उपस्थिति और अनुक्रमित के गठन बहुत अपने परिणामों को प्रभावित करेगा में बताया; हालांकि, चूंकि SQL सर्वर पृष्ठों को देखने के लिए पृष्ठों के साथ काम करता है, और संकुचित कॉलम प्रकार प्रति पृष्ठ अधिक डेटा स्टोर कर सकते हैं, एक संकीर्ण प्रकार का उपयोग करके व्यापक प्रकार से बेहतर प्रदर्शन कर सकते हैं जहां विचार करने के लिए अधिक मूल्य हैं।

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

बेशक, बड़ी या छोटी टेबल का गठन आपके हार्डवेयर पर निर्भर करता है।

+3

बदलना यह भी सच है यदि उसके पास लंबे वर्चर्स फ़ील्ड हैं। चूंकि 'int' 8 बाइट्स है, इसलिए उसे' int 'के लिए वर्चकार की प्रति पंक्ति 6 ​​वर्णों की औसत औसत – JNK

+0

विशिष्टताएं अक्सर एक अच्छा नियम-अंगूठे बर्बाद कर देती हैं, लेकिन आप इसके साथ प्रत्येक प्रश्न का उत्तर नहीं दे सकते निर्भर करता है "। Tinyints (एक पूर्णांक मान लेकिन int नहीं) 1 बाइट हैं, जो किसी भी वर्चर कॉलम से कम है (और एक char (1) के बराबर)। नियम अभी भी लागू होता है; प्रकार को संकुचित करें, प्रदर्शन के लिए बेहतर क्षमता। –

1

पूर्णांक की तुलना करना बहुत कम स्तर पर तेज़ होना चाहिए, यह 1 cmp निर्देश के साथ समाप्त हो जाएगा। स्ट्रिंग की तुलना में अधिक निर्देश शामिल हैं, और नतीजतन, खराब प्रदर्शन।
मुझे लगता है कि आप या तो या दोनों क्षेत्रों पर अनुक्रमित की जरूरत नहीं है, अनुक्रमित समान रूप से चयनात्मक हैं, अभिलेखों की संख्या भी एक ही

+0

मैं समझता हूं कि यह तेज़ होना चाहिए, लेकिन मैं यह समझने की कोशिश कर रहा हूं कि यह साबित करने के लिए ठोस तरीका है या नहीं? क्या इसका यह भी अर्थ है कि अलग-अलग ओएस सिस्टम या हार्डवेयर भी पूर्णांक से तुलना कर सकते हैं जब पूर्णांक की तुलना में तारों की तुलना बनाते हैं –

+0

मुझे लगता है कि इसे साबित करने या अस्वीकार करने का केवल 100% निर्विवाद तरीका SQLServer स्रोत कोड को देखना है जो स्ट्रिंग और संख्या तुलना को संभालता है। निजी तौर पर, मैं नहीं देखता कि गैर-खाली तारों की तुलना (जो संख्याओं के 2 सरणी की तुलना कर रही है) की तुलना में तेज़ी से 2 संख्याओं की तुलना में तेज़ी से हो सकती है। – a1ex07

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