हमारे पास काफी बड़े रिकॉर्ड गणना (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 पंक्तियाँ हैं)।
मैंने सोचा था कि शायद यह विजेट तालिका में लिखने के प्रदर्शन को कमजोर कर देगा, लेकिन नहीं - इस तालिका में आवेषण और अपडेट का प्रदर्शन बहुत अधिक अप्रभावित है जहां तक मैं बता सकता हूं (प्लस, इस तालिका में डेटा वेयरहाउस होने के कारण इसे बार-बार अपडेट किया जाता है वैसे भी)
मेरे लिए, यह सच होने के लिए बहुत अच्छा लगता है - क्या यह है? इस तरह अनुक्रमित विचारों का उपयोग करते समय मुझे क्या सावधानी बरतने की आवश्यकता है?
SELECT
औरCREATE VIEW
लिपियों, गलत हैं के रूप में मेरा मानना है कि अपने हैCREATE INDEX
स्क्रिप्ट।