आप नहीं कर सकते। 2017 RTM में यह सुविधा अक्षम है।
उस ने कहा, आप कर सकते हैं ...
एडवेंचरवर्क्स का उपयोग करना:
CREATE VIEW dbo.TH
WITH SCHEMABINDING
AS
SELECT P.ProductID, COUNT_BIG(*) AS cbs
FROM Production.Product AS P
JOIN Production.TransactionHistory AS TH
ON TH.ProductID = P.ProductID
GROUP BY P.ProductID;
GO
CREATE UNIQUE CLUSTERED INDEX cuq ON dbo.TH (ProductID)
WITH (SNAPSHOT_MATERIALIZATION = ON);
अंतर्निहित तालिकाओं में परिवर्तन तुरंत दृश्य में परिलक्षित नहीं होता है (जैसा कि आमतौर पर SQL सर्वर के साथ होता है)। इसी तरह, अंतर्निहित तालिकाओं के खिलाफ डेटा संशोधनों को स्नैपशॉट अनुक्रमित दृश्य बनाए रखने की आवश्यकता नहीं है।
दृश्य सामग्री को ताज़ा करने के लिए, किसी को नई संग्रहीत प्रक्रियाओं में से एक को कॉल करने की आवश्यकता होती है:
EXECUTE sys.sp_refresh_single_snapshot_view
@view_name = N'dbo.TH',
@rgCode = 0; -- don't know what this is for yet
यह निष्पादन योजना तैयार करता है:
यह संभावना आपके लिए काम नहीं करेगी, क्योंकि या तो एक अनिर्धारित ट्रेस ध्वज की आवश्यकता है, या आपको विशेष रूप से बुरा काम करना होगा जो मैंने किया था: इस सुविधा को सक्षम करने के लिए सुविधा ध्वज (डिबगर का उपयोग करके) को पकड़े हुए मेमोरी स्थान पर लिखना।
यदि आप उत्सुक हैं, तो सुविधा ध्वज बाइट पर है sqllang!g_featureSwitchesLangSvc+0x10f
। के दौरान इसकी जाँच की जाती है sqllang!SpRefreshSingleSnapshotView
।
यदि आप साथ खेलना चाहते हैं, और SQL सर्वर के कोड के बारे में हैकिंग के परिणामों को स्वीकार करने के लिए पूरी तरह से तैयार हैं, जबकि यह चल रहा है, और एक ऐसी सुविधा का उपयोग करना जो Microsoft नहीं समझता कि अभी तक तैयार है:
- SQL सर्वर 2017 प्रक्रिया के लिए डिबगर संलग्न करें। मैं WinDbg का उपयोग करता हूं।
एक ब्रेकपॉइंट सेट करें:
bp sqllang!SpRefreshSingleSnapshotView
Go कमांड का उपयोग करके SQL सर्वर को फिर से शुरू करें ( g
)
- उपरोक्त दृश्य बनाएं, लेकिन अभी तक अद्वितीय क्लस्टर इंडेक्स नहीं
sys.sp_refresh_single_snapshot_view
ऊपर कमांड चलाएं
जब ब्रेकपॉइंट मारा जाता है, तब तक कदम रखें जब तक आप कोड लाइन नहीं देखते:
cmp byte ptr [sqllang!g_featureSwitchesLangSvc+0x10f (00007fff`328dfbcf)],0
अन्य बिल्ड में ऑफसेट भिन्न हो सकते हैं, उदाहरण के लिए 2017 RTM CU3 में sqllang!g_featureSwitchesLangSvc+0x114
कोष्ठकों के अंदर मेमोरी पता अलग हो सकता है। आप जो देख रहे हैं, उसका उपयोग करें।
आपके द्वारा पाए गए स्मृति पते पर वर्तमान मान देखने के लिए डिस्प्ले मेमोरी कमांड का उपयोग करें:
db 00007fff`328dfbcf L1
यह एक शून्य दिखाना चाहिए, यह दर्शाता है कि सुविधा अक्षम है।
दर्ज मान कमांड (फिर से अपने मेमोरी एड्रेस के साथ) का उपयोग करके शून्य को एक में बदलें:
eb 00007fff`328dfbcf 1
ब्रेकपॉइंट को अक्षम करें और SQL सर्वर को फिर से शुरू करें।
- सुविधा अब सक्षम है।
- दृश्य पर अद्वितीय क्लस्टर इंडेक्स बनाएँ।
- मूर्ख या गैर जिम्मेदाराना व्यवहार।
नोट SNAPSHOT_MATERIALIZATION
हमें क्वेरी विनिर्देश के स्नैपशॉट को अमल में लाने की अनुमति देता है जो आमतौर पर अनुक्रमित नहीं किया जा सकता है, उदाहरण के लिए नीचे दिए गए उपयोग MAX
:
CREATE VIEW dbo.TH2
WITH SCHEMABINDING
AS
SELECT TH.ProductID, MaxTransactionID = MAX(TH.TransactionID)
FROM Production.TransactionHistory AS TH
GROUP BY TH.ProductID;
GO
CREATE UNIQUE CLUSTERED INDEX cuq ON dbo.TH2 (ProductID)
WITH (SNAPSHOT_MATERIALIZATION = ON);
परिणाम:
कमांड सफलतापूर्वक पूरा हुआ।