EXCEPT ऑपरेटर के पीछे एल्गोरिथ्म क्या है?


10

SQL सर्वर में कवर के अलावा सिवाय ऑपरेटर कैसे काम करता है, इसका आंतरिक एल्गोरिथ्म क्या है ? क्या यह आंतरिक रूप से प्रत्येक पंक्ति का हैश लेता है और तुलना करता है?

डेविड लोज़िंकी ने एक अध्ययन चलाया, एसक्यूएल: नए रिकॉर्ड डालने का सबसे तेज़ तरीका , जहां कोई पहले से मौजूद नहीं है उन्होंने दिखाया कि सिवाय इसके कि बयान बड़ी संख्या में पंक्तियों के लिए सबसे तेज़ है; नीचे हमारे परिणामों के लिए बारीकी से बांधना।

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

पृष्ठभूमि: हमारी टीम दो ढेर तालिकाओं की तुलना कर रही थी। तालिका A पंक्तियों को तालिका B में नहीं, तालिका B में डाला गया था।

ढेर तालिकाओं (विरासत पाठ फाइलसिस्टम से) में प्राथमिक कुंजी / गाइड / पहचानकर्ता नहीं होते हैं। कुछ तालिकाओं में डुप्लिकेट पंक्तियाँ थीं, इसलिए हमने प्रत्येक पंक्ति के Hash को पाया, और डुप्लिकेट को हटा दिया, और प्राथमिक कुंजी पहचानकर्ता बनाए।

1) सबसे पहले हम एक अपवाद को छोड़कर (हैश कॉलम)

select * from TableA
Except
Select * from TableB,

2) इसके बाद हमने HashRowId पर दो टेबलों के बीच एक लेफ्ट जॉइन तुलना की

select * 
FROM dbo.TableA A
left join dbo.TableB B
    on A.RowHash =  B.RowHash
where B.Hash is null

आश्चर्यजनक रूप से सिवाय स्टेटमेंट इंसर्ट सबसे तेज था।

परिणाम वास्तव में डेविड लोज़िंकी से परीक्षण परिणामों के करीब नक्शा

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


जवाबों:


10

SQL सर्वर में कवर के अलावा सिवाय ऑपरेटर कैसे काम करता है, इसका आंतरिक एल्गोरिथ्म क्या है?

मैं यह नहीं कहूंगा कि इसके लिए एक विशेष आंतरिक एल्गोरिदम है EXCEPTA EXCEPT Bइंजन के लिए , ए से अलग (यदि आवश्यक हो) ट्यूपल्स लेता है और बी में मेल खाने वाली पंक्तियों को घटाता है। कोई विशेष क्वेरी प्लान ऑपरेटर नहीं हैं। विशिष्ट और घटाव ठेठ ऑपरेटरों के माध्यम से लागू किया जाता है जिन्हें आप एक प्रकार के साथ या एक सम्मिलित के साथ देखेंगे। नेस्टेड लूप शामिल होते हैं, मर्ज जॉइन होते हैं, और हैश जॉइन सभी समर्थित होते हैं। यह दिखाने के लिए, मैं 15 मिलियन पंक्तियों को ढेर की एक जोड़ी में फेंक दूंगा:

DROP TABLE IF EXISTS dbo.TABLE_1;

CREATE TABLE dbo.TABLE_1 (
    COL1 BIGINT NULL,
    COL2 BIGINT NULL
);

INSERT INTO dbo.TABLE_1 WITH (TABLOCK)
SELECT TOP (15000000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), NULL
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
OPTION (MAXDOP 1);


DROP TABLE IF EXISTS dbo.TABLE_2;

CREATE TABLE dbo.TABLE_2 (
    COL1 BIGINT NULL,
    COL2 BIGINT NULL
);

INSERT INTO dbo.TABLE_2 WITH (TABLOCK)
SELECT TOP (15000000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), NULL
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
OPTION (MAXDOP 1);

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

मिलती है

क्या यह आंतरिक रूप से प्रत्येक पंक्ति का हैश लेता है और तुलना करता है?

नहीं। इसे किसी अन्य जॉइन के रूप में लागू किया गया है। एक अंतर यह है कि NULLs को समान माना जाता है। यह एक विशेष प्रकार की तुलना है जिसे आप निष्पादन योजना में देख सकते हैं <Compare CompareOp="IS">:। हालाँकि, आप T-SQL के साथ वही योजना प्राप्त कर सकते हैं जिसमें EXCEPTकीवर्ड शामिल नहीं है । उदाहरण के लिए, निम्नलिखित में उसी क्वेरी प्लान के समान है EXCEPTजो किसी हैश ज्वाइन का उपयोग करता है:

SELECT t1.*
FROM
(
    SELECT DISTINCT COL1, COL2
    FROM dbo.TABLE_1
) t1
WHERE NOT EXISTS (
    SELECT 1
    FROM dbo.TABLE_2 t2
    WHERE (t1.COL1 = t2.COL1 OR (t1.COL1 IS NULL AND t2.COL1 IS NULL))
    AND (t1.COL2 = t2.COL2 OR (t1.COL2 IS NULL AND t2.COL2 IS NULL))
);

निष्पादन योजनाओं के एक्सएमएल को मुश्किल करना केवल उपनाम और इस तरह की चीजों के आसपास के सतही अंतर को प्रकट करता है। हैश जॉइन के लिए जांच अवशिष्ट पंक्ति तुलना करते हैं। वे दोनों प्रश्नों के लिए समान हैं:

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

यदि आपको अभी भी संदेह है, तो मैंने क्वेरी के लिए और इसके बिना क्वेरी के लिए कॉल स्टैक प्राप्त करने के लिए उच्चतम उपलब्ध नमूना दर के साथ PerfView चलाया EXCEPT। यहाँ परिणाम के साथ-साथ हैं:

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

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

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

कोई भी हैशिंग जो हैश मैच ऑपरेटरों के कार्यान्वयन के कारण होती है। वहाँ कुछ खास नहीं है EXCEPTजिसके बारे में एक विशेष, आंतरिक हैशिंग तुलना है।

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