কোনও ম্যাচের ক্ষেত্রের সাথে সমস্ত পূর্ববর্তী রেকর্ডগুলির মোট গণনা সন্ধান করার জন্য যখন সাবকোয়ারি ব্যবহার করা হয়, তখন 50 কিলোমিটারেরও কম রেকর্ড সহ কোনও টেবিলে পারফরম্যান্স ভয়ানক। সাবকিউরিটি ব্যতীত ক্যোরিটি কয়েক মিলিসেকেন্ডে চালিত হয়। সাবকিউরির সাথে, কার্যকর করার সময়টি এক মিনিটের উপরে।
এই ক্যোয়ারির জন্য, ফলাফল অবশ্যই:
- একটি নির্দিষ্ট তারিখের মধ্যে কেবল সেই রেকর্ডগুলি অন্তর্ভুক্ত করুন।
- তারিখের সীমা নির্বিশেষে বর্তমান রেকর্ড সহ সমস্ত পূর্ববর্তী রেকর্ডগুলির একটি গণনা অন্তর্ভুক্ত করুন।
বেসিক টেবিল স্কিমা
Activity
======================
Id int Identifier
Address varchar(25)
ActionDate datetime2
Process varchar(50)
-- 7 other columns
উদাহরণ ডেটা
Id Address ActionDate (Time part excluded for simplicity)
===========================
99 000 2017-05-30
98 111 2017-05-30
97 000 2017-05-29
96 000 2017-05-28
95 111 2017-05-19
94 222 2017-05-30
প্রত্যাশিত ফলাফল
তারিখ সীমা 2017-05-29
জন্য2017-05-30
Id Address ActionDate PriorCount
=========================================
99 000 2017-05-30 2 (3 total, 2 prior to ActionDate)
98 111 2017-05-30 1 (2 total, 1 prior to ActionDate)
94 222 2017-05-30 0 (1 total, 0 prior to ActionDate)
97 000 2017-05-29 1 (3 total, 1 prior to ActionDate)
রেকর্ডস 96 এবং 95 ফলাফল থেকে বাদ দেওয়া হয়েছে, কিন্তু PriorCount
subquery অন্তর্ভুক্ত করা হয়
বর্তমান প্রশ্ন
select
*.a
, ( select count(*)
from Activity
where
Activity.Address = a.Address
and Activity.ActionDate < a.ActionDate
) as PriorCount
from Activity a
where a.ActionDate between '2017-05-29' and '2017-05-30'
order by a.ActionDate desc
বর্তমান সূচি
CREATE NONCLUSTERED INDEX [IDX_my_nme] ON [dbo].[Activity]
(
[ActionDate] ASC
)
INCLUDE ([Address]) WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
)
প্রশ্ন
- এই কোয়েরির কার্যকারিতা উন্নত করতে কোন কৌশলগুলি ব্যবহার করা যেতে পারে?
1 সম্পাদনা করুন
আমি ডিবিতে কী পরিবর্তন করতে পারি এই প্রশ্নের জবাবে: আমি সূচিগুলি পরিবর্তন করতে পারি, কেবল সারণির কাঠামো নয় not
2 সম্পাদনা করুন
আমি এখন Address
কলামে একটি প্রাথমিক সূচক যুক্ত করেছি , তবে এটির খুব বেশি উন্নতি হবে বলে মনে হয় না। আমি বর্তমানে একটি টেম্প টেবিল তৈরি করে PriorCount
এবং মানগুলি সন্নিবেশ করে এবং তারপরে প্রতিটি নির্দিষ্ট সীমাটি তাদের নির্দিষ্ট গণনা সহ আপডেট করার মাধ্যমে আরও ভাল পারফরম্যান্সটি খুঁজে পাচ্ছি ।
3 সম্পাদনা করুন
সূচক স্পুল জো ওবিশ (স্বীকৃত উত্তর) পাওয়া গেল বিষয়টি ছিল। একবার আমি একটি নতুন যুক্ত করার পরে nonclustered index [xyz] on [Activity] (Address) include (ActionDate)
, ক্যোরির সময়গুলি টেম্প টেবিলটি ব্যবহার না করে এক মিনিটের উপরে থেকে এক সেকেন্ডেরও কম চলে যায় (সম্পাদনা 2 দেখুন)।
nonclustered index [xyz] on [Activity] (Address) include (ActionDate)
, ক্যোয়ারির সময়গুলি এক মিনিটের উপর থেকে এক সেকেন্ডেরও কম চলে গেছে। +10 যদি আমি পারতাম। ধন্যবাদ!