समुच्चय के लिए अनुक्रमित विचारों का उपयोग करना - सच्चा होना बहुत अच्छा है?


28

हमारे पास काफी बड़े रिकॉर्ड गणना (10-20 मिलियन पंक्तियों) के साथ एक डेटा वेयरहाउस है और अक्सर कुछ प्रश्नों के बीच रिकॉर्ड्स को गिनने या कुछ झंडे के साथ रिकॉर्ड गिनने वाले प्रश्नों को चलाने के लिए, जैसे।

SELECT
    f.IsFoo,
    COUNT(*) AS WidgetCount
FROM Widgets AS w
JOIN Flags AS f
    ON f.FlagId = w.FlagId
WHERE w.Date >= @startDate
GROUP BY f.IsFoo

प्रदर्शन भयानक नहीं है, लेकिन अपेक्षाकृत सुस्त हो सकता है (शायद एक ठंडे कैश पर 10 सेकंड)।

हाल ही में मुझे पता चला कि मैं GROUP BYअनुक्रमित दृश्यों में उपयोग कर सकता हूं और इसलिए निम्नलिखित के समान कुछ करने की कोशिश की

CREATE VIEW TestView
WITH SCHEMABINDING
AS
    SELECT
        Date,
        FlagId,
        COUNT_BIG(*) AS WidgetCount
    FROM Widgets
    GROUP BY Date, FlagId;
GO

CREATE UNIQUE CLUSTERED INDEX PK_TestView ON TestView
(
    Date,
    FlagId
);

परिणामस्वरूप मेरी पहली क्वेरी का प्रदर्शन अब <100ms है, और परिणामी दृश्य और सूचकांक <100k है (हालांकि हमारी पंक्ति गणना बड़ी है, तिथियों और ध्वज आईडी की सीमा का मतलब है कि इस दृश्य में केवल 1000-2000 पंक्तियाँ हैं)।

मैंने सोचा था कि शायद यह विजेट तालिका में लिखने के प्रदर्शन को कमजोर कर देगा, लेकिन नहीं - इस तालिका में आवेषण और अपडेट का प्रदर्शन बहुत अधिक अप्रभावित है जहां तक ​​मैं बता सकता हूं (प्लस, इस तालिका में डेटा वेयरहाउस होने के कारण इसे बार-बार अपडेट किया जाता है वैसे भी)

मेरे लिए, यह सच होने के लिए बहुत अच्छा लगता है - क्या यह है? इस तरह अनुक्रमित विचारों का उपयोग करते समय मुझे क्या सावधानी बरतने की आवश्यकता है?


2
क्या आप अपनी स्क्रिप्ट फिर से लिख सकते हैं ताकि वे वास्तव में वैध एसक्यूएल हों? आपका SELECTऔर CREATE VIEWलिपियों, गलत हैं के रूप में मेरा मानना है कि अपने है CREATE INDEXस्क्रिप्ट।
मार्क सिंकिनसन

2
@MarkSinkinson माफी, काल्पनिक तालिकाओं के लिए वैध एसक्यूएल लिखने की कोशिश कर रहा है कि मुश्किल है
जस्टिन

मेरे हिस्से के लिए 'बहुत अच्छा होना' सच है, जब मैं अधिक उन्नत विचार चाहता था, जैसे कि अधिकतम वाले, स्व या बाहरी जुड़ाव, या एक दृश्य को अनुक्रमणित करना जो स्वयं किसी अन्य दृश्य का संदर्भ देता है - जिनमें से सभी SQL सर्वर में कम से कम नहीं हैं अनुमत docs.microsoft.com/en-us/sql/relational-dat डेटाबेस/views/… । इसलिए मैं हमेशा अति महत्वाकांक्षी हो रहा हूं और फिर चीजों को वापस पैमाना कर रहा हूं। लेकिन सरल एकत्रीकरण के लिए वे वास्तव में महान हैं - यहां तक ​​कि एसयूएम भी समर्थित है।
सिमोन_विवर

जवाबों:


29

जैसा कि आपने नोट किया है, दृश्य केवल छोटी संख्या में पंक्तियों को उत्प्रेरित करता है - इसलिए भले ही आप पूरी तालिका को अपडेट करते हों, दृश्य को अपडेट करने में शामिल अतिरिक्त I / O नगण्य है। जब आप दृश्य बनाते हैं तो आपको शायद सबसे बड़ा दर्द महसूस होता है। यदि आप व्यू में नई पंक्तियों की आवश्यकता के साथ बेस टेबल पर एक गज़िलियन पंक्तियों को जोड़ते हैं तो अगला निकटतम होगा।

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

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

नॉन-क्लस्टर्ड इंडेक्स की तरह, बस इसे ज़्यादा न करने के लिए सावधान रहें। यदि आप एक तालिका में 10 अलग-अलग अनुक्रमित दृश्य जोड़ते हैं, तो आप अपने वर्कलोड के लेखन हिस्से पर अधिक प्रभाव देखने जा रहे हैं, खासकर यदि ग्रुपिंग कॉलम (एस) क्लस्टरिंग कुंजी नहीं है।

गोश, मुझे इस विषय के बारे में ब्लॉग से मतलब है।


19

हारून जवाब ने इस सवाल को अच्छी तरह से कवर किया। जोड़ने के लिए दो बातें:

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

मैंने एकत्रीकरण दोनों का उपयोग किया है और अत्यधिक लाभ के साथ विचार जोड़ते हैं।

आपके सभी उपयोग के मामले में एक आदर्श मामला लगता है। अनुक्रमित विचार एक तकनीक है जिसे अभी तक रेखांकित किया गया है।

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