हैश कीज जांच और अवशिष्ट


21

कहो, हमारे पास इस तरह एक प्रश्न है:

select a.*,b.*
from 
a join b
on a.col1=b.col1
and len(a.col1)=10

उपर्युक्त क्वेरी को मानने से हैश ज्वाइन का उपयोग होता है और इसमें एक अवशिष्ट होता है, जांच कुंजी होगी col1और अवशिष्ट होगा len(a.col1)=10

लेकिन एक अन्य उदाहरण से गुजरते हुए, मैं जांच और अवशिष्ट दोनों को एक ही स्तंभ के रूप में देख सकता था। नीचे मैं क्या कहने की कोशिश कर रहा हूँ पर एक विस्तार है:

प्रश्न:

select *
from T1 join T2 on T1.a = T2.a 

निष्पादन और अवशिष्ट के साथ निष्पादन योजना:

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

परीक्षण डेटा:

create table T1 (a int, b int, x char(200))
create table T2 (a int, b int, x char(200))

set nocount on
declare @i int
set @i = 0
while @i < 1000
  begin
      insert T1 values (@i * 2, @i * 5, @i)
    set @i = @i + 1
  end

declare @i int
set @i = 0
while @i < 10000
  begin
    insert T2 values (@i * 3, @i * 7, @i)
    set @i = @i + 1
  end

सवाल:

एक जाँच और अवशिष्ट एक ही स्तंभ कैसे हो सकते हैं? SQL सर्वर केवल जांच कॉलम का उपयोग क्यों नहीं कर सकता है? फिर से पंक्तियों को फ़िल्टर करने के लिए अवशिष्ट के रूप में उसी कॉलम का उपयोग क्यों करना पड़ता है?

परीक्षण डेटा के लिए संदर्भ:

जवाबों:


22

अगर में शामिल होने है पर एक एकल स्तंभ आपके द्वारा लिखा गया के रूप में tinyint, smallintया integer* और अगर दोनों स्तंभ होने के लिए विवश कर रहे हैं NOT NULL, हैश फंक्शन 'सही' है - जिसका अर्थ है वहाँ एक हैश टकराव की कोई संभावना नहीं है, और क्वेरी प्रोसेसर की जांच की जरूरत नहीं है मूल्यों को फिर से सुनिश्चित करने के लिए कि वे वास्तव में मेल खाते हैं।

अन्यथा, आपको एक अवशिष्ट दिखाई देगा क्योंकि हैश बाल्टी में आइटम एक मैच के लिए परीक्षण किए जाते हैं, न कि केवल एक हैश फ़ंक्शन मैच के लिए।

आपका परीक्षण निर्दिष्ट नहीं करता है NULLया NOT NULLस्तंभों के लिए (एक बुरा अभ्यास, वैसे), इसलिए ऐसा प्रतीत होता है कि आप एक डेटाबेस का उपयोग कर रहे हैं जहां NULLडिफ़ॉल्ट है।

मेरी पोस्ट में अधिक जानकारी प्रदर्शन, इंप्लिमेंट कन्वर्सेशन , और रेजिड्यूल्स और हैश दिमित्री पिलुगिन द्वारा निष्पादन इंटर्नल्स में शामिल हों


* अन्य योग्यता प्रकार बिट , smalldatetime , smallmoney , और (var) char (n) के लिए n = 1 और बाइनरी कॉलेशन हैं

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