निष्पादन योजना मूल बातें - हैश मैच भ्रम


39

मैं निष्पादन योजनाओं को सीखना शुरू कर रहा हूं और इस बारे में उलझन में हूं कि वास्तव में एक हैश मैच कैसे काम करता है और इसे एक साधारण जुड़ाव में क्यों इस्तेमाल किया जाएगा:

select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)

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

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

मुझे क्या समझ में आता है कि उनके बीच सामान्य क्षेत्र है, आईडी, हैशेड - लेकिन अगर यह मामला है, तो हैश का एक नंबर क्यों है?

जवाबों:


29

SQLRockstar के उत्तर के रूप में

बड़े, बिना इनपुट के सर्वोत्तम।

अभी व,

  • Users.DisplayName इंडेक्स स्कैन (नॉन-क्लस्टर्ड मान लिया गया) से आप Users.Id को प्राप्त करते हैं (क्लस्टर्ड मान लेते हैं) =
  • आप OwnerUserId = अनसोल्ड के लिए डाक भी स्कैन कर रहे हैं

यह 2 अनियंत्रित इनपुट है।

मैं शीर्षक सहित OwnerUserId पर पोस्ट टेबल पर एक सूचकांक पर विचार करूंगा। यह इनपुट के एक तरफ कुछ आदेश जोड़ देगा + यह इंडेक्स को कवर करेगा

CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)

तब आप पा सकते हैं कि Users.DisplayName इंडेक्स का उपयोग नहीं किया जाएगा और यह PK की जगह स्कैन करेगा।


1
आह ठीक है, मैं अब देख रहा हूं, मैं सोच रहा था। यूजरप्लेनेम को पीके द्वारा आदेश दिया जा रहा है जो कि केवल मामला नहीं है। अब हश का इस्तेमाल मेरे लिए बहुत मायने रखता है। धन्यवाद!
काइल ब्रांट

1
आप OPTION (FAST n)संकेत भी आज़मा सकते हैं , जहाँ n आपके द्वारा अपेक्षित पंक्तियों की संख्या है। यह क्या करेगा पक्षपाती nas कम है जब nh की तुलना में नेस्टेड छोरों की ओर अनुकूलक है। कारण यह है कि हैश ज्वाइन बड़ी जॉइन के लिए तेज है, लेकिन एक उच्च स्टार्टअप लागत है। नेस्टेड लूप्स प्रति पंक्ति महंगे हैं, लेकिन बहुत सस्ते में शुरू हो सकते हैं। तो यह आपके वास्तविक डेटा और एक्सेस पैटर्न के आधार पर ठीक ट्यूनिंग की बात है।
गयुस

1
@Gaius: व्यक्तिगत रूप से मैं संकेत के बजाय अनुक्रमित होता। जब आप इसे जोड़ते हैं तो एक संकेत केवल क्वेरी के लिए अच्छा होता है। अका संकेत समय के साथ एक दायित्व बन जाता है। सूचकांक बहुत लंबे समय तक उपयोगी होते हैं।
gbn

1
यह या तो एक या प्रस्ताव नहीं है :-)
Gaius

14

से http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/

"हैश ज्वाइन अधिक महंगी ज्वाइन ऑपरेशन्स में से एक है, क्योंकि इसमें जॉइन करने के लिए हैश टेबल बनाने की आवश्यकता होती है। उस ने कहा, यह ज्वाइन है जो कि बड़े, अनसोल्ड इनपुट्स के लिए सबसे अच्छा है। यह किसी भी तरह का सबसे मेमोरी-इंटेंसिव है। में शामिल होते हैं

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

जो इस पोस्ट का लिंक देता है:

http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx

HTH


तो अगर यह सिर्फ आईडी फ़ील्ड है, तो मुझे लगता है कि मैं एक आईडी फ़ील्ड हैशिंग के लाभ को नहीं समझता हूं?
काइल ब्रांट

क्रेग फ्रीडमैन के ब्लॉग के लिंक के लिए +1, अधिक लेख उपलब्ध हैं: blogs.msdn.com/b/craigfr/archive/tags/joins
Jeff

9

एक संख्यात्मक क्षेत्र हैशिंग का लाभ यह है कि आप एक बड़ा मूल्य ले रहे हैं और इसे छोटे टुकड़ों में तोड़ रहे हैं ताकि यह हैश तालिका में फिट हो सके।

यहां बताया गया है कि ग्रांट फ्रिटेची इसका वर्णन कैसे करते हैं:

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

आप नीचे दिए गए लेख के एक लिंक से उनके ई-पुस्तक की "नि: शुल्क प्रतिलिपि SQL सर्वर निष्पादन योजना" भी प्राप्त कर सकते हैं:

स्रोत: http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/



मैं अपने तरीके से काम कर रहा हूं, हालांकि SQL सर्वर एक्ज़ीक्यूशन प्लान्स को डिसेक्ट करना - यह बहुत अच्छा है! लेकिन मैं इस बिंदु पर थोड़ा अटक गया :-P
काइल ब्रांट

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