यह मैक्स वेर्नन के काम को सुधारने के लिए एक प्रयास है । अपने समाधान में, वह दृश्य और आँकड़े ऑब्जेक्ट पर 2 अनुक्रमित का उपयोग करने का सुझाव देता है।
पहली अनुक्रमणिका को संकुलित किया जाता है, जो वास्तव में एक मेज पर एक गैर-अनुक्रमित सूचकांक के विपरीत आवश्यक है, एक त्रुटि उत्पन्न हो जाएगी यदि दृश्य पर एक गैर-अनुक्रमित सूचकांक का निर्माण पहले क्लस्टर किए गए सूचकांक के बिना करने का प्रयास किया जाता है।
2 सूचकांक एक गैर-अनुक्रमित सूचकांक है, जिसका उपयोग क्वेरी के पीछे सूचकांक के रूप में किया जाता है। उनके जवाब के टिप्पणी अनुभाग में, मैंने पूछा कि अगर एक गैर-अनुक्रमित सूचकांक के बजाय एक संकुल सूचकांक का उपयोग किया जाता है तो क्या होगा।
निम्नलिखित विश्लेषण इस प्रश्न का उत्तर देने का प्रयास करता है।
मैं उनके सटीक समान कोड का उपयोग कर रहा हूं, सिवाय इसके कि मैं दृश्य पर एक अस्पष्ट अनुक्रम नहीं बना रहा हूं।
मैं एक आँकड़े ऑब्जेक्ट भी नहीं बना रहा हूँ। यदि आप नीचे दिए गए कोड को दर्ज करने के लिए SQL सर्वर प्रबंधन स्टूडियो (SSMS) का साथ और उपयोग कर रहे हैं, तो आपको पता होना चाहिए कि आपको कुछ लाल स्क्वीजी लाइनें दिखाई दे सकती हैं - जो त्रुटियों की तरह दिखती हैं। ये (शायद) त्रुटियां नहीं हैं, लेकिन एक मुद्दे को अंतर्मुखी के साथ शामिल करते हैं।
आप या तो intellisense को अक्षम कर सकते हैं या केवल त्रुटियों को अनदेखा कर सकते हैं और कमांड चला सकते हैं। उन्हें त्रुटियों के बिना पूरा करना चाहिए।
-- Create the test table that uses a computed column.
USE tempdb;
CREATE TABLE dbo.PersistedViewTest
(
PersistedViewTest_ID INT NOT NULL
CONSTRAINT PK_PersistedViewTest
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, SomeData VARCHAR(2000) NOT NULL
, TestComputedColumn AS (PersistedViewTest_ID - 1) PERSISTED
);
GO
-- Insert some test data into the table.
INSERT INTO dbo.PersistedViewTest (SomeData)
SELECT o.name + o1.name + o2.name
FROM sys.objects o
CROSS JOIN sys.objects o1
CROSS JOIN sys.objects o2;
GO
निम्नलिखित क्वेरी योजना (कोई दृश्य / सूचकांक दृश्य के साथ) निम्न क्वेरी तालिका के विरुद्ध चलाने के बाद निर्मित होती है:
SELECT pv.PersistedViewTest_ID, pv.TestComputedColumn
FROM dbo.PersistedViewTest pv
WHERE pv.TestComputedColumn = CONVERT(INT, 26)
GO
यह तुलना करने के लिए एक आधार रेखा देता है। ध्यान दें कि क्वेरी पूरी होने के बाद, एक सांख्यिकी ऑब्जेक्ट बनाया गया था (_WA_Sys_00000003_1FCDBCEB)। PK_PersistedViewTest आँकड़े ऑब्जेक्ट तब बनाया गया था जब संकुल तालिका सूचकांक बनाया गया था।
इसके बाद, उस दृश्य पर फ़िल्टर किए गए दृश्य और क्लस्टर किए गए अनुक्रमणिका बनाए जाते हैं:
-- Create filtered view on the computed column.
CREATE VIEW dbo.PersistedViewTest_View
WITH SCHEMABINDING
AS
SELECT PersistedViewTest_ID, SomeData, TestComputedColumn
FROM dbo.PersistedViewTest
WHERE TestComputedColumn < CONVERT(INT, 27);
GO
-- Create unique clustered index to persist the values, including the computed column.
CREATE UNIQUE CLUSTERED INDEX IX_PersistedViewTest
ON dbo.PersistedViewTest_View(PersistedViewTest_ID);
GO
अब, क्वेरी को फिर से चलाने का प्रयास करें, लेकिन इस बार दृश्य के विरुद्ध:
SELECT pv.PersistedViewTest_ID, pv.TestComputedColumn
FROM dbo.PersistedViewTest_View pv
WHERE pv.TestComputedColumn = CONVERT(INT, 26)
GO
नई निष्पादन योजना अब है:
यदि नई योजना पर विश्वास किया जाना है, तो उस दृश्य पर दृश्य और क्लस्टर इंडेक्स को जोड़ने के बाद, आंकड़े इंगित करते हैं कि क्वेरी को निष्पादित करने के लिए आवश्यक समय अब दोगुना हो गया है। इसके अलावा, ध्यान दें कि क्वेरी के चलने के बाद नए इंडेक्स का समर्थन करने के लिए कोई नई सांख्यिकी ऑब्जेक्ट नहीं बनाई गई थी, जो टेबल पर क्वेरी से अलग है।
क्वेरी योजना अभी भी बताती है कि क्वेरी के प्रदर्शन को बेहतर बनाने में एक गैर-अनुक्रमित सूचकांक का निर्माण काफी सहायक होगा। तो, क्या इसका मतलब यह है कि वांछित प्रदर्शन सुधार प्राप्त करने से पहले एक गैर-अनुक्रमित सूचकांक को दृश्य में जोड़ा जाना चाहिए? कोशिश करने के लिए एक आखिरी चीज है। "NOEXPAND" विकल्प का उपयोग करने के लिए क्वेरी को संशोधित करें:
SELECT pv.PersistedViewTest_ID, pv.TestComputedColumn
FROM dbo.PersistedViewTest_View pv WITH (NOEXPAND)
WHERE pv.TestComputedColumn = CONVERT(INT, 26)
GO
यह निम्नलिखित क्वेरी योजना में परिणाम देता है:
यह निष्पादन योजना काफी हद तक उसी के समान दिखती है जिसे मैक्स वर्नोन के उत्तर में दिए गए गैर-अनुक्रमित सूचकांक के साथ बनाया गया था। लेकिन, यह एक कम (nonclustered) सूचकांक और एक कम आँकड़े ऑब्जेक्ट के साथ किया जाता है।
यह पता चलता है कि NOEXPAND विकल्प को अनुक्रमित दृश्य का उचित उपयोग करने के लिए SQL सर्वर के एक्सप्रेस और मानक संस्करणों के साथ उपयोग किया जाना है। पॉल व्हाइट के पास एक उत्कृष्ट लेख है जो NOEXPAND विकल्प का उपयोग करने के लाभों पर विस्तार करता है। उन्होंने यह भी सिफारिश की है कि इस विकल्प का उपयोग एंटरप्राइज़ संस्करण के साथ किया जाए ताकि यह सुनिश्चित किया जा सके कि व्यू इंडेक्स द्वारा प्रदान की गई विशिष्टता का उपयोग ऑप्टिमाइज़र द्वारा किया जाता है।
उपरोक्त विश्लेषण SQL Sever 2014 के एक्सप्रेस संस्करण के साथ किया गया था। मैंने इसे SQL Server 2016 के डेवलपर संस्करण के साथ भी आज़माया। प्रदर्शन लाभ प्राप्त करने के लिए NOEXPAND विकल्प विकास संस्करण के साथ आवश्यक नहीं लगता है, लेकिन फिर भी इसकी अनुशंसा की जाती है। ।
5 महीने से भी कम समय पहले, Microsoft ने डेवलपर संस्करणों को निःशुल्क बनाया था । लाइसेंस केवल विकास के लिए उपयोग को प्रतिबंधित करता है, जिसका अर्थ है कि डेटाबेस का उत्पादन वातावरण में उपयोग नहीं किया जा सकता है। इसलिए, यदि आप मेमोरी ऑप्टिमाइज़्ड टेबल, एन्क्रिप्शन, आर, इत्यादि का परीक्षण करना चाहते हैं तो अब आपके पास नो-लाइसेंस बहाना है। मैंने इसे सफलतापूर्वक अपने कंप्यूटर पर साइड SQL सर्वर 2014 एक्सप्रेस के साथ कुछ मुद्दों पर स्थापित किया है।
WHERE (sintMarketID = 2 AND strType = 'CARD' AND strTier1 LIKE 'GG%')
यद्यपि आप एक फ़िल्टर्ड इंडेक्स बना सकते हैं ।