SQL में दो बड़े डेटा सेट की तुलना करने का एक कुशल तरीका


12

वर्तमान में, मैं दो डेटा सेटों की तुलना कर रहा हूं, जिनमें अद्वितीय StoreKey/ProductKeyसंयोजन होते हैं ।

StoreKey/ProductKeyजनवरी 2012 से शुरू होकर मई 2014 के बीच बिक्री के लिए 1 डेटा सेट का अद्वितीय संयोजन है (परिणाम = 450K लाइनें)। 2 डी डेटा सेट में अद्वितीय StoreKey/ProductKeyसंयोजन होते हैं, बिक्री के लिए जून 2014 से शुरू होता है, आज तक (परिणाम = 190K लाइनें)।

मैं उन StoreKey/ProductKeyसंयोजनों को ढूंढना चाह रहा हूं जो 2 सेट में हैं, लेकिन 1 सेट में नहीं - यानी जून की शुरुआत से बेचे गए नए उत्पाद।

अब तक, मैंने दो डेटा सेट्स को टेम्‍प टेबल में डंप कर दिया है, दोनों कीज़ पर दोनों टेबलों के लिए इंडेक्स बनाए हैं, और EXCEPTयूनीक आइटम खोजने के लिए स्टेटमेंट का उपयोग किया है ।

ऐसे बड़े डेटा सेट की तुलना करने का सबसे कुशल तरीका क्या है? क्या इस प्रकार की बड़ी तुलना करने का एक अधिक कुशल तरीका है?

जवाबों:


10

EXCEPT का उपयोग करना मेरी राय में यहाँ जाने का तरीका है, लेकिन आप अस्थायी तालिका के उपयोग पर पुनर्विचार करना चाह सकते हैं। ऐसा करने से आप अपने डेटा को स्मृति में प्रभावी रूप से दोहरा रहे हैं, जो आपको धीमा कर देगा। यदि स्रोत तालिका में मौजूद इंडेक्स की आपको आवश्यकता है (जैसा कि मुझे संदेह है), बस उपयुक्त SELECTS की तुलना करें:

SELECT StoreKey,ProductKey FROM table WHERE sales BETWEEN date1 AND date2
EXCEPT
SELECT StoreKey,ProductKey FROM table WHERE sales BETWEEN date3 AND date4

1
सही है, तालिका में अनुक्रमित हैं, लेकिन यह दो आवश्यक क्षेत्रों पर एक क्लस्टर सूचकांक है, साथ ही एक क्षेत्र जिसका नाम TransactionDeKey है। यदि मैं या तो लागू करता हूं तो एक बड़ा अंतर देखा जाएगा: ए ()। StoreKey और ProductKey पर एक क्लस्टर इंडेक्स।) क्रमशः StoreKey और ProductKey पर दो अलग-अलग गैर-क्लस्टर इंडेक्स?
पियरे प्रीटोरियस

1
मुझे लगता TransactionDateKeyहै कि समय अवधि को फ़िल्टर करने के लिए उपयोग किया जाने वाला स्तंभ है। उस स्थिति में संकुल सूचकांक TransactionDateKey, StoreKeyऔर ProductKeyएकदम सही है।
ट्विंकल

1

यदि आप एल्गोरिदम (बिग-ओ जटिलता) से परिचित हैं, तो यह तुलना करना सबसे अच्छा हे (एन लॉग (एन)) है। सबसे कुशल एल्गोरिथ्म दोनों डेटा सेट को सॉर्ट करेगा, फिर मिलान (या बेजोड़) कुंजी खोजने के लिए उन्हें समानांतर में एक मर्ज रन बनाते हैं। अधिकांश RDBMS ऑप्टिमाइज़र आपके लिए स्वचालित रूप से ऐसा करेंगे जब आप उपयोग कर रहे हैं EXCEPTया MINUS। आपकी व्याख्या योजना पुष्टि या विवेचना करेगी। यदि आप नेस्टेड लूप देखते हैं, तो आप O (n ^ 2) कर रहे हैं, उतना कुशल नहीं है।


धन्यवाद जोशुआ। बिग-ओ जटिलता से परिचित नहीं है, लेकिन निश्चित रूप से इस पर एक नज़र होगी।
पियरे प्रीटोरियस

जटिलता विश्लेषण के बारे में अधिक जानने के लिए लिंक, जो कुछ लोग बोलचाल के रूप में बिग-ओ के रूप में संदर्भित करते हैं। यह उतना कठिन नहीं है जितना कि यह पहले दिख सकता है। जब लोग कहते हैं कि एक कार्य रैखिक समय या बहुपद समय में चलेगा, तो यह वही है जिसका वे उल्लेख कर रहे हैं। सामान्य रूप से डेटाबेस बैकअप रैखिक है, जिसका अर्थ है कि 2x डेटाबेस का आकार बैकअप के लिए 2x समय लेता है। डेटा को छाँटना हालांकि यह रैखिक नहीं है। एक फ़ाइल 2x जितना बड़ा होता है 2x को सॉर्ट करने में अधिक समय लगता है। bigocheatsheet.com , wiki en.wikipedia.org/wiki/Time_complexity में यह सबसे तेजी से संभव तुलना प्रकार का उल्लेख करता है "लीनरिथमिक टाइम" = एन लॉग (एन)।
जोशुआ ह्यूबर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.