SQL सर्वर 2012 में दो क्वेरीज़ की तुलना करना


14

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

FREEPROCCACHE और DROPCLEANBUFFERS के साथ प्रत्येक क्वेरी को निष्पादित करने से पहले बफ़र पूल को साफ़ किया गया था

नीचे दी गई जानकारी का उपयोग करते हुए, कौन सी क्वेरी बेहतर विकल्प है?

-- Query 1 - return the maximum order id for a customer
SELECT orderid, custid
FROM Sales.Orders AS O1
WHERE orderid = (SELECT MAX(O2.orderid)
                 FROM Sales.Orders AS O2
                 WHERE O2.custid = O1.custid);


-- Query 2 - return the maximum order id for a customer
SELECT MAX(orderid), custid
FROM Sales.Orders AS O1
group by custid
order by custid

सांख्यिकी समय

क्वेरी 1 सांख्यिकी समय: सीपीयू समय = 0ms, बीता समय = 24 एमएस

क्वेरी 2 सांख्यिकी समय: सीपीयू समय = 0 एमएस, बीता हुआ समय = 23 एमएस

सांख्यिकी IO

प्रश्न 1 सांख्यिकी IO: तालिका 'आदेश'। स्कैन काउंट 1, लॉजिकल रीड 5, फिजिकल रीड्स 2, रीड-फॉरवर्ड रीड्स 0, लॉब लॉजिकल रीड्स 0, लॉब फिजिकल रीड्स 0, लॉब रीड-फॉरवर्ड रीड्स 0।

क्वेरी 2 सांख्यिकी IO: तालिका 'आदेश'। स्कैन काउंट 1, लॉजिकल रीड 4, फिजिकल रीड्स 1, रीड-फॉरवर्ड रीड 8, लॉब लॉजिकल रीड्स 0, लॉब फिजिकल रीड्स 0, लॉब रीड-फॉरवर्ड रीड्स 0।

निष्पादन योजनाएं

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

चयन गुण क्वेरी 1

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

गुण का चयन करें क्वेरी 2

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

निष्कर्ष:

प्रश्न 1

  1. बैच लागत 48%
  2. तार्किक रीति ५
  3. शारीरिक प्रतिक्रिया २
  4. पढ़ें-आगे पढ़े: 0
  5. सीपीयू समय: 0ms
  6. बीता हुआ समय 24ms
  7. अनुमानित सबट्री लागत: 0.0050276
  8. CompileCPU: 2
  9. कम्पाइलमोरी: 384
  10. संकलन: २

प्रश्न २

  1. बैच की लागत 52%
  2. तार्किक रीति ४
  3. शारीरिक प्रतिक्रिया १
  4. पढ़ें-आगे पढ़ें: 8
  5. सीपीयू समय ०
  6. बीता हुआ समय 23ms
  7. अनुमानित सबट्री लागत: 0.0054782
  8. CompileCPU: 0
  9. कम्पाइलमोरी: 192
  10. संकलन समय: 0

व्यक्तिगत रूप से, भले ही क्वेरी 2 में चित्रमय योजना के अनुसार एक उच्च बैच लागत है, मुझे लगता है कि इसकी अधिक प्रभावशाली है कि क्वेरी 1। क्योंकि क्वेरी 2 के लिए कम तार्किक रीड की आवश्यकता होती है, थोड़ा कम समय व्यतीत होता है, संकलन, संकलन, और अनिवार्य जीवन मूल्य होते हैं। कम। 1-क्वेरी के लिए 2 और 0 के लिए रीड-फॉरवर्ड रीड 8 हैं।

अपडेट 12:03

क्लस्टर इंडेक्स परिभाषा

ALTER TABLE [Sales].[Orders] ADD  CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED 
(
    [orderid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

गैर-संकुल सूचकांक idx_nc_custid

CREATE NONCLUSTERED INDEX [idx_nc_custid] ON [Sales].[Orders]
(
    [custid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
पॉल व्हाइट 9

जवाबों:


10

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

मैंने जल्दी से इसमें 200,000 बिक्री के आदेश के साथ एक SalesOrders तालिका बनाई - अभी भी कल्पना के किसी भी खिंचाव से विशाल नहीं है। और प्रत्येक में ORDER BY के साथ प्रश्नों को चलाया। मैं भी अनुक्रमित के साथ थोड़ा खेला।

आर्डरआईडी पर कोई संकुलित सूचकांक नहीं होने के कारण, कस्टिड पर सिर्फ एक गैर-संकुलित सूचकांक दूसरी क्वेरी से बेहतर है। विशेष रूप से प्रत्येक में शामिल करके आदेश के साथ। दूसरी क्वेरी की तुलना में पहली क्वेरी पर दोगुना था, और प्रश्नों के बीच लागत प्रतिशत 67% / 33% था।

आदेश पर एक संकुल सूचकांक के साथ और केवल संकुल पर एक गैर-संकुल सूचकांक के साथ उन्होंने एक समान गति और सटीक एक ही संख्या में प्रदर्शन किया।

इसलिए मैं आपको पंक्तियों की संख्या बढ़ाने और कुछ और परीक्षण करने का सुझाव दूंगा। लेकिन आपके प्रश्नों पर मेरा अंतिम विश्लेषण -

जब आप पंक्तियों को बढ़ाते हैं, तो आपको एहसास होता है कि आप उनसे अधिक समान व्यवहार कर सकते हैं, इसलिए उस चेतावनी को ध्यान में रखें और उस तरह से परीक्षण करें।

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

अपडेट किया गया: आपके प्रश्न के अंतर्गत आपकी एक टिप्पणी थी:

कृपया ध्यान रखें, इस प्रश्न में सबसे अच्छी क्वेरी का पता लगाना उनकी तुलना के लिए उपयोग की जाने वाली तकनीकों को परिष्कृत करने का एक साधन है।

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

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


नमस्कार फिर, बड़ी मात्रा में डेटा का उपयोग करने के बारे में आपके बिंदुओं के लिए धन्यवाद। यह पहली बार नहीं है जब किसी ने इसे लाया है। हालांकि पिछली बार पृष्ठ विभाजन से संभावित विखंडन पर विचार करना था। अपने 200,000 पंक्ति नमूने में, क्या आपने विखंडन पर जांच की थी?
क्रेग एफ्रेइन

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

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

मैंने सिर्फ 100 ग्राहक बनाने के लिए RAND फ़ंक्शन का उपयोग किया है और प्रत्येक ऑर्डर पर एक को यादृच्छिक रूप से असाइन किया है .. मैं एक त्वरित जांच कर रहा था। :)
माइक वॉल्श

आपकी मदद के लिए धन्यवाद माइक। हालांकि एक आखिरी सवाल। 2012 में निष्पादन योजना से चयनित गुण स्क्रीन से, जो मैंने अपने प्रश्न में प्रदान किया था, आप किन मूल्यों पर ध्यान देते हैं?
क्रेग एफ्रेइन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.