আমাদের কাছে বেশ বড় রেকর্ড গণনা (10-20 মিলিয়ন সারি) সহ একটি ডেটা গুদাম রয়েছে এবং প্রায়শই এমন অনুসন্ধান চালানো হয় যা নির্দিষ্ট তারিখের মধ্যে রেকর্ড গণনা করে বা নির্দিষ্ট পতাকা সহ রেকর্ড গণনা করে eg
SELECT
f.IsFoo,
COUNT(*) AS WidgetCount
FROM Widgets AS w
JOIN Flags AS f
ON f.FlagId = w.FlagId
WHERE w.Date >= @startDate
GROUP BY f.IsFoo
পারফরম্যান্সটি ভয়াবহ নয়, তবে তুলনামূলকভাবে আলগা হতে পারে (ঠান্ডা ক্যাশে সম্ভবত 10 সেকেন্ড)।
সম্প্রতি আমি আবিষ্কার করেছি যে আমি GROUP BY
ইনডেক্সড ভিউগুলিতে ব্যবহার করতে পারি এবং নীচের মতো কিছু মিলিয়ে দেখতে চেষ্টা করেছি
CREATE VIEW TestView
WITH SCHEMABINDING
AS
SELECT
Date,
FlagId,
COUNT_BIG(*) AS WidgetCount
FROM Widgets
GROUP BY Date, FlagId;
GO
CREATE UNIQUE CLUSTERED INDEX PK_TestView ON TestView
(
Date,
FlagId
);
ফলস্বরূপ আমার প্রথম ক্যোয়ারীর পারফরম্যান্সটি এখন <100 মিমি, এবং ফলাফল এবং সূচকটি <100 কে (যদিও আমাদের সারি গণনা বড়, তারিখ এবং পতাকা আইডির সীমাটি এই ভিউটিতে কেবল 1000-2000 সারি রয়েছে)।
আমি ভেবেছিলাম সম্ভবত এটি উইজেট টেবিলে লেখার পারফরম্যান্সকে বিকৃত করে দেবে, তবে না - এই টেবিলটিতে সন্নিবেশ এবং আপডেটের পারফরম্যান্সটি যতটা আমি বলতে পারি ততই বেশ ক্ষতিগ্রস্থ হয়েছে (প্লাস, ডেটা গুদাম হওয়ার কারণে এই টেবিলটি খুব কম সময়ে আপডেট হয়) যাহাই হউক না কেন)
আমার কাছে, এটি সত্য বলে মনে হয় খুব ভাল - তাই না? এভাবে সূচকযুক্ত দর্শনগুলি ব্যবহার করার সময় আমার কী সাবধানতা অবলম্বন করা উচিত?
SELECT
এবংCREATE VIEW
স্ক্রিপ্টগুলি ভুল, কারণ আমি বিশ্বাস করি আপনারCREATE INDEX
স্ক্রিপ্ট।