এসকিউএল সার্ভার 2017 এ আপনি কীভাবে SNAPSHOT_MATERIALIZATION দিয়ে একটি ভিউ তৈরি করবেন?


36

এসকিউএল সার্ভার 2017 এর কয়েকটি নতুন সঞ্চিত পদ্ধতি রয়েছে:

  • sp_refresh_single_snapshot_view - @ ভিউ_নাম এনভারচার (261), @ আরজিকোড ইন্টির জন্য ইনপুট পরম
  • sp_refresh_snapshot_views - @rgCode ইন্টের জন্য ইনপুট প্যারাম

এবং sys.messages এ নতুন এন্ট্রি:

  • 10149 - SNAPSHOT_MATERIALIZATION রয়েছে এমন সূচকটি '%। * Ls' দর্শনে তৈরি করা যায় না কারণ দেখার সংজ্ঞাটিতে মেমরি-অপ্টিমাইজড টেবিল (গুলি) রয়েছে।
  • 10642 - SNAPSHOT_MATERIALIZATION '%। * Ls' তে '%। * Ls' এর সূচকের জন্য সেট করা যায় না কারণ এটি কেবলমাত্র দর্শনগুলির সূচীতে প্রযোজ্য।
  • 10643 - SNAPSHOT_MATERIALIZATION '%। * Ls' এর জন্য '%। * Ls' এর জন্য সেট করা যায় না কারণ এটি শুধুমাত্র দর্শনগুলিতে ক্লাস্টার ইনডেক্সগুলিতে প্রযোজ্য।
  • 10648 - SNAPSHOT_MATERIALIZATION '%। * Ls' তে পার্টিশনযুক্ত সূচক '%। * Ls' এর জন্য সেট করা যাবে না।
  • 10649 - ননক্র্লাস্টারড সূচক '%। * Ls' '%। * Ls' তে তৈরি করা যাবে না যা ক্লাস্টার ইনডেক্স '%।
  • 10650 - স্ন্যাপশট দৃশ্যের রিফ্রেশের জন্য ডাটাবেসে স্ন্যাপশট বিচ্ছিন্নকরণ সক্ষম করা দরকার।
  • 3760 - '%। * Ls' ভিউতে '%। * Ls' ছাড়তে পারে না যাতে SNAPSHOT_MATERIALIZATION রয়েছে।
  • 4524 - '%। * Ls' দর্শনটি পরিবর্তন করা যায় না কারণ এতে স্ন্যাপশট মেটেরালাইজেশন রয়েছে।
  • 4525 - ভিউ '%। * Ls' তে ইঙ্গিত '% ls' ব্যবহার করা যাবে না যা ভিউ রিফ্রেশ হওয়ার আগে স্ন্যাপশটের ম্যাটেরিয়ালাইজেশন রয়েছে।

এবং নতুন বর্ধিত ইভেন্টগুলি:

স্ন্যাপশট ভিউ প্রসারিত ইভেন্টগুলি

তাহলে আমরা কীভাবে একটি স্ন্যাপশট-পদার্থযুক্ত দৃশ্য তৈরি করতে পারি? (মাইক্রোসফ্ট এখনও এটিকে নথিভুক্ত করেনি, স্পষ্টতই।) এখানে এতক্ষণ চেষ্টা করেছি যে কাজ করে নি।

উত্তর:


55

আপনি পারবেন না। বৈশিষ্ট্যটি 2017 আরটিএম-এ অক্ষম করা আছে।


বলেছিল, আপনি পারবেন ...

অ্যাডভেঞ্চার ওয়ার্কস ব্যবহার:

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);

অন্তর্নিহিত টেবিলগুলির পরিবর্তনগুলি তাত্ক্ষণিকভাবে দর্শনে প্রতিফলিত হয় না (যেমনটি সাধারণত এসকিউএল সার্ভারের ক্ষেত্রে হয়)। তেমনি, অন্তর্নিহিত টেবিলগুলির বিপরীতে ডেটা সংশোধন করার জন্য স্ন্যাপশট সূচক দৃষ্টিভঙ্গি বজায় রাখতে হবে না।

দর্শন সামগ্রীটি রিফ্রেশ করার জন্য, আমাদের নতুন সঞ্চিত পদ্ধতিগুলির মধ্যে একটিতে কল করতে হবে:

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

যদি আপনি পাশাপাশি খেলতে চান এবং এসকিউএল সার্ভারের কোডটি চলাকালীন হ্যাকিংয়ের পরিণতিগুলি গ্রহণ করতে সম্পূর্ণরূপে প্রস্তুত থাকেন এবং মাইক্রোসফ্ট এখনও এমন প্রস্তুত বলে মনে করেন না এমন একটি বৈশিষ্ট্য ব্যবহার করে:

  1. এসকিউএল সার্ভার 2017 পদ্ধতিতে একটি ডিবাগার সংযুক্ত করুন। আমি WinDbg ব্যবহার করি।
  2. একটি ব্রেকপয়েন্ট সেট করুন:

    bp sqllang!SpRefreshSingleSnapshotView
  3. গো কমান্ড ( 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. ব্রেকপয়েন্টটি অক্ষম করুন এবং এসকিউএল সার্ভার চালানো পুনরায় শুরু করুন।

  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);

ফলাফল:

কমান্ডগুলি সফলভাবে সম্পন্ন হয়েছে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.