একটি সূচকযুক্ত দৃশ্যের জন্য আদর্শ দৃশ্যের মতো শোনাচ্ছে, যা আপনাকে ক্যোরি সময়ের পরিবর্তে লেখার সময় গণনা এবং সমষ্টিগুলির জন্য অর্থ প্রদান করতে দেয়।
CREATE VIEW dbo.MyIndexedView
WITH SCHEMABINDING
AS
SELECT Enroll_Date, UserID, RawCount = COUNT_BIG(*)
FROM dbo.UserTable
GROUP BY Enroll_Date, UserID;
GO
CREATE UNIQUE CLUSTERED INDEX CIX_miv ON dbo.MyIndexedView(Enroll_Date, UserID);
এটি তৈরি করতে কিছুটা সময় লাগবে এবং অবশ্যই বেস টেবিলের সূচির মতো সমস্ত ডিএমএল ক্রিয়াকলাপের রক্ষণাবেক্ষণের প্রয়োজন হবে।
এখন এই দৃশ্যের বিপরীতে কোয়েরিটি একই রকম হবে - ভিউয়ের প্রতিটি সারি এখন একটি পৃথক ব্যবহারকারী / তারিখের কম্বো উপস্থাপন করে, যাতে সেই চিত্রটি একটি একক COUNT (*) দ্বারা গণনা করা যায়, যখন বেস টেবিলের সারিগুলির মোট সংখ্যা is ইতিমধ্যে আপনার জন্য আংশিকভাবে একত্রিত হয়েছে, এখন কেবল আপনাকে প্রতি তারিখের জন্য এসএমএম ব্যবহার করে এগুলি যুক্ত করতে হবে:
SELECT Enroll_Date,
[Record #] = SUM(RawCount),
[User #] = COUNT(*)
FROM dbo.MyIndexedView WITH (NOEXPAND)
GROUP BY Enroll_Date;
NOEXPAND ইঙ্গিতটি দিনের কথা মনে পরে যোগ করা এই এবং এই ।
আমি আপনাকে সন্দেহ ছাড়াই বলতে পারি যে এই কোয়েরিটি আপনার বর্তমান ক্যোয়ারীর চেয়ে দ্রুত হবে (তবে কতটা নয়), বিরল ক্ষেত্রে যেখানে আপনার প্রতিটি তারিখের জন্য ঠিক একজন ব্যবহারকারী রয়েছে (সেই ক্ষেত্রে একই পরিমাণের ডেটা থাকবে) পড়তে হবে) এবং আমরা যে কলামগুলি সম্পর্কে জানি সেগুলি বেস টেবিলের সূচকের একমাত্র কলাম। পড়ার সময় সেই কর্মক্ষমতা বৃদ্ধির অতিরিক্ত কাজের মূল্য কিনা আপনার কাজের চাপের লেখার অংশকে প্রভাবিত করবে এমন কিছু যা আমরা আপনাকে বলতে পারি না - ট্রেড-অফ পরিমাপ করার জন্য আপনাকে এটি পরীক্ষা করতে হবে (কোনও সূচি মুক্ত নয়)।
এবং যদি আপনি নির্দিষ্ট, সুনির্দিষ্ট-সংজ্ঞায়িত রেঞ্জগুলির জন্য এনরোল_ডেটের বিপরীতে একই সাধারণ WHERE ধারাগুলি ব্যবহার করেন (বলুন, বর্তমান ত্রৈমাসিক বা তারিখের বছর) তবে আপনি মিলে যাওয়া ফিল্টার সূচকগুলি যোগ করতে পারেন যা I / O আরও কমিয়ে দেয় (তবে সর্বদা একটি আছে ভারসাম্য).
আপনি বেস টেবিলের উপর একটি ক্লাস্টার্ড সূচক স্থাপন বিবেচনা করতে পারেন। এটি খুব বিরল ব্যবহারের কেসগুলির মধ্যে একটি বলে মনে হয় না যে গাদা থেকে উপকারী।