आप SQL सर्वर 2017 में SNAPSHOT_MATERIALIZATION के साथ एक दृश्य कैसे बनाते हैं?


36

SQL सर्वर 2017 में कुछ नई संग्रहीत प्रक्रियाएँ हैं:

  • sp_refresh_single_snapshot_view - @ par_name nvarchar (261), @rgCode int के लिए इनपुट परम
  • sp_refresh_snapshot_ साक्षात्कार - @rgCode int के लिए इनपुट परम

और sys.messages में नई प्रविष्टियाँ:

  • 10149 - SNAPSHOT_MATERIALIZATION वाले सूचकांक को '%। * Ls' पर नहीं बनाया जा सकता क्योंकि दृश्य परिभाषा में स्मृति-अनुकूलित तालिका (s) हैं।
  • 10642 - SNAPSHOT_MATERIALIZATION को '%। * Ls' पर '%। * Ls' के लिए सेट नहीं किया जा सकता है क्योंकि यह केवल विचारों पर अनुक्रमित के लिए लागू होता है।
  • 10643 - SNAPSHOT_MATERIALIZATION '%। * Ls' के लिए '%। * Ls' पर सेट नहीं किया जा सकता है क्योंकि यह केवल विचारों पर संकुल अनुक्रमित पर लागू होता है।
  • 10648 - SNAPSHOT_MATERIALIZATION को विभाजित किए गए सूचकांक '%' के लिए सेट नहीं किया जा सकता। * ls '%। * Ls' पर।
  • 10649 - गैर-अनुक्रमित सूचकांक '%। * ls' '%। * Ls' पर नहीं बनाया जा सकता है, जिसका क्लस्टर इंडेक्स '% है। * SNAPSHOT_MATERIALIZATION के साथ।
  • 10650 - स्नैपशॉट दृश्य को ताज़ा करने के लिए डेटाबेस पर स्नैपशॉट अलगाव को सक्षम करने की आवश्यकता होती है।
  • 3760 - '%। * Ls' को '%। * Ls' पर नहीं छोड़ा जा सकता। इसमें SNAPSHOT_MATERIALIZATION है।
  • 4524 - दृश्य '%। * Ls' को बदल नहीं सकता क्योंकि इसमें स्नैपशॉट का भौतिककरण है।
  • 4525 - दृश्य '% * पर संकेत'% ls 'का उपयोग नहीं किया जा सकता है। दृश्य को ताज़ा करने से पहले स्नैपशॉट भौतिककरण है।

और नए विस्तारित कार्यक्रम:

स्नैपशॉट विस्तारित घटनाएँ देखें

तो हम एक स्नैपशॉट-भौतिकवादी दृश्य कैसे बना सकते हैं? (Microsoft ने इसे अभी तक, स्पष्ट रूप से प्रलेखित नहीं किया है।) यहां उन चीजों के साथ एक जिस्म है, जो मैंने अब तक काम किए हैं।

जवाबों:


55

आप नहीं कर सकते। 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 नहीं समझता कि अभी तक तैयार है:

  1. SQL सर्वर 2017 प्रक्रिया के लिए डिबगर संलग्न करें। मैं WinDbg का उपयोग करता हूं।
  2. एक ब्रेकपॉइंट सेट करें:

    bp sqllang!SpRefreshSingleSnapshotView
  3. Go कमांड का उपयोग करके SQL सर्वर को फिर से शुरू करें ( g)

  4. उपरोक्त दृश्य बनाएं, लेकिन अभी तक अद्वितीय क्लस्टर इंडेक्स नहीं
  5. sys.sp_refresh_single_snapshot_viewऊपर कमांड चलाएं
  6. जब ब्रेकपॉइंट मारा जाता है, तब तक कदम रखें जब तक आप कोड लाइन नहीं देखते:

    cmp byte ptr [sqllang!g_featureSwitchesLangSvc+0x10f (00007fff`328dfbcf)],0

    अन्य बिल्ड में ऑफसेट भिन्न हो सकते हैं, उदाहरण के लिए 2017 RTM CU3 में sqllang!g_featureSwitchesLangSvc+0x114

  7. कोष्ठकों के अंदर मेमोरी पता अलग हो सकता है। आप जो देख रहे हैं, उसका उपयोग करें।

  8. आपके द्वारा पाए गए स्मृति पते पर वर्तमान मान देखने के लिए डिस्प्ले मेमोरी कमांड का उपयोग करें:

    db 00007fff`328dfbcf L1
  9. यह एक शून्य दिखाना चाहिए, यह दर्शाता है कि सुविधा अक्षम है।

  10. दर्ज मान कमांड (फिर से अपने मेमोरी एड्रेस के साथ) का उपयोग करके शून्य को एक में बदलें:

    eb 00007fff`328dfbcf 1
  11. ब्रेकपॉइंट को अक्षम करें और SQL सर्वर को फिर से शुरू करें।

  12. सुविधा अब सक्षम है।
  13. दृश्य पर अद्वितीय क्लस्टर इंडेक्स बनाएँ।
  14. मूर्ख या गैर जिम्मेदाराना व्यवहार।

नोट 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);

परिणाम:

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