আপনি পারবেন না। বৈশিষ্ট্যটি 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
।
যদি আপনি পাশাপাশি খেলতে চান এবং এসকিউএল সার্ভারের কোডটি চলাকালীন হ্যাকিংয়ের পরিণতিগুলি গ্রহণ করতে সম্পূর্ণরূপে প্রস্তুত থাকেন এবং মাইক্রোসফ্ট এখনও এমন প্রস্তুত বলে মনে করেন না এমন একটি বৈশিষ্ট্য ব্যবহার করে:
- এসকিউএল সার্ভার 2017 পদ্ধতিতে একটি ডিবাগার সংযুক্ত করুন। আমি WinDbg ব্যবহার করি।
একটি ব্রেকপয়েন্ট সেট করুন:
bp sqllang!SpRefreshSingleSnapshotView
গো কমান্ড ( 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
ব্রেকপয়েন্টটি অক্ষম করুন এবং এসকিউএল সার্ভার চালানো পুনরায় শুরু করুন।
- বৈশিষ্ট্যটি এখন সক্ষম হয়েছে।
- ভিউতে অনন্য ক্লাস্টারড সূচক তৈরি করুন।
- চারপাশে খেলা.
নোট 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);
ফলাফল:
কমান্ডগুলি সফলভাবে সম্পন্ন হয়েছে।