এটি ম্যাক্স ভার্ননের চারপাশের কাজের উন্নতির চেষ্টা at । তার সমাধানে তিনি ভিউতে 2 টি সূচক এবং কোনও পরিসংখ্যান অবজেক্ট ব্যবহার করার পরামর্শ দেন।
1 ম সূচকটি ক্লাস্টার করা হয়, যা আসলে কোনও টেবিলের অবিচ্ছিন্ন সূচকের বিপরীতে প্রয়োজনীয় কারণ, ভিউতে একটি অবিবাহিত সূচক তৈরির চেষ্টা করা থাকলে প্রথমে একটি ক্লাস্টারযুক্ত সূচক না থাকলে ত্রুটি তৈরি করা হবে।
২ য় সূচকটি একটি অনিবন্ধিত সূচক, যা ক্যোয়ারির পিছনে সূচক হিসাবে ব্যবহৃত হয়। তার উত্তরের মন্তব্য বিভাগে, আমি জিজ্ঞাসা করেছি যে যদি ক্লাস্টারড সূচকটি একটি নন-ক্ল্লাস্টার্ড সূচক পরিবর্তে ব্যবহার করা হয় তবে কী হবে।
নিম্নলিখিত বিশ্লেষণ এই প্রশ্নের উত্তর দেওয়ার চেষ্টা করে।
আমি তার সঠিক একই কোডটি ব্যবহার করছি, যদি না আমি ভিউতে একটি অবিবাহিত সূচক তৈরি না করি।
আমি একটি পরিসংখ্যান অবজেক্টও তৈরি করছি না। যদি আপনি নীচের কোডটি প্রবেশের জন্য এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও (এসএসএমএস) অনুসরণ করে এবং ব্যবহার করে থাকেন তবে আপনাকে সচেতন হওয়া উচিত যে আপনি কয়েকটি লাল স্কুইগ্লি লাইন দেখতে পাচ্ছেন - যা ত্রুটির মতো দেখায়। এগুলি (সম্ভবত) ত্রুটি নয়, তবে ইন্টেলিজেন্স সহ কোনও সমস্যা জড়িত।
আপনি হয় ইন্টেলিজেন্স অক্ষম করতে পারেন বা কেবল ত্রুটি উপেক্ষা করে কমান্ডগুলি চালাতে পারেন। তাদের ত্রুটি ছাড়াই সম্পূর্ণ করা উচিত।
-- 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
নতুন এক্সিকিউশন প্ল্যান এখন:
যদি নতুন পরিকল্পনার বিশ্বাস করা হয়, তবে সেই ভিউতে ভিউ এবং ক্লাস্টারড ইনডেক্স যুক্ত হওয়ার পরে, পরিসংখ্যানগুলি প্রদর্শিত হয় যে কোয়েরিটি কার্যকর করার জন্য প্রয়োজনীয় সময়টি এখন দ্বিগুণ হয়ে গেছে। এছাড়াও, খেয়াল করুন যে কোয়েরিটি চালুর পরে নতুন সূচককে সমর্থন করার জন্য কোনও নতুন পরিসংখ্যান অবজেক্ট তৈরি করা হয়নি, যা টেবিলে থাকা প্রশ্নের থেকে আলাদা।
ক্যোয়ারী প্ল্যানটি এখনও পরামর্শ দেয় যে একটি অবিবাহিত সূচক তৈরি করা ক্যোয়ারীর কার্যকারিতা উন্নত করতে বেশ সহায়ক হবে। সুতরাং, এর অর্থ কি এই যে একটি কাঙ্ক্ষিত সূচকটি পছন্দসই পারফরম্যান্সের উন্নতি অর্জনের আগে ভিউতে যুক্ত করতে হবে? চেষ্টা করার জন্য একটি শেষ জিনিস আছে। "উইথ ননপ্যাণ্ড" বিকল্পটি ব্যবহার করতে ক্যোয়ারীটি পরিবর্তন করুন:
SELECT pv.PersistedViewTest_ID, pv.TestComputedColumn
FROM dbo.PersistedViewTest_View pv WITH (NOEXPAND)
WHERE pv.TestComputedColumn = CONVERT(INT, 26)
GO
নিম্নলিখিত কোয়েরি পরিকল্পনার ফলাফল:
এই এক্সিকিউশন প্ল্যানটি ম্যাক্স ভার্ননের উত্তরে প্রদত্ত নন ক্ল্লাস্টারড ইনডেক্সের সাথে উত্থাপিত পরিকল্পনার সাথে বেশ মিল রয়েছে। তবে, এটি একটি কম (ননক্র্লাস্টারড) সূচক এবং আরও একটি কম পরিসংখ্যান অবজেক্টের সাথে সম্পন্ন হয়।
দেখা যাচ্ছে যে এনএক্সএক্সএন্ড বিকল্পটি একটি ইনডেক্স ভিউটির যথাযথ ব্যবহার করতে এসকিউএল সার্ভারের এক্সপ্রেস এবং স্ট্যান্ডার্ড সংস্করণগুলির সাথে ব্যবহার করতে হবে। পল হোয়াইটের একটি দুর্দান্ত নিবন্ধ রয়েছে যা NOEXPAND বিকল্পটি ব্যবহারের সুবিধার জন্য ব্যাখ্যা করে। তিনি সুপারিশও করেন এই বিকল্পটি এন্টারপ্রাইজ সংস্করণে ব্যবহার করা হবে তা নিশ্চিত করতে যাতে ভিউ ইনডেক্সগুলি সরবরাহকারীর দ্বারা সরবরাহ করা স্বতন্ত্রতা গ্যারান্টিটি অপ্টিমাইজার দ্বারা ব্যবহৃত হয়।
উপরের বিশ্লেষণটি এসকিউএল সেভার ২০১৪ এর এক্সপ্রেস সংস্করণ দিয়ে করা হয়েছিল। আমি এসকিউএল সার্ভার ২০১ 2016 এর বিকাশকারী সংস্করণ দিয়েও এটি চেষ্টা করেছিলাম। পারফরম্যান্স লাভ অর্জনের জন্য নোক্সপ্যান্ড বিকল্পটি বিকাশ সংস্করণের সাথে প্রয়োজনীয় বলে মনে হচ্ছে না, তবে এখনও প্রস্তাবিত ।
5 মাসেরও কম আগে মাইক্রোসফ্ট বিকাশকারী সংস্করণগুলি বিনামূল্যে তৈরি করে । লাইসেন্সটি কেবলমাত্র উন্নয়নের ক্ষেত্রে ব্যবহারকে সীমাবদ্ধ করে, যার অর্থ ডেটাবেস উত্পাদন পরিবেশে ব্যবহার করা যায় না। সুতরাং, আপনি যদি মেমরির অপ্টিমাইজড টেবিলগুলি, এনক্রিপশন, আর ইত্যাদি পরীক্ষা করার চেষ্টা করছেন তবে আপনার আর লাইসেন্স-অজুহাত নেই। কোনও সমস্যা ছাড়াই আমি কয়েক দিন আগে এসকিউএল সার্ভার ২০১৪ এক্সপ্রেস পাশাপাশি আমার কম্পিউটারে এটি সফলভাবে ইনস্টল করেছি।
WHERE (sintMarketID = 2 AND strType = 'CARD' AND strTier1 LIKE 'GG%')
যদিও ফিল্টার সূচক তৈরি করতে পারেন ।