আমি million 250 মিলিয়ন ডলারের রেকর্ড সহ একটি টেবিল অ্যাক্সেস করছে এমন একটি ক্যোয়ারির বাইরে আরও কিছু পারফরম্যান্স কোক্সে করার চেষ্টা করছি। বাস্তব প্রয়োগের পরিকল্পনাটি আমার পড়া থেকে, প্রথম বাধা হ'ল এমন একটি কোয়েরি যা দেখে মনে হচ্ছে:
select
b.stuff,
a.added,
a.value
from
dbo.hugetable a
inner join
#smalltable b on a.fk = b.pk
where
a.added between @start and @end;
জড়িত সারণী ও সূচীর সংজ্ঞাগুলির জন্য আরও নীচে দেখুন।
এক্সিকিউশন প্ল্যান ইঙ্গিত করে যে একটি নেস্টেড লুপটি # স্মার্ট টেবিলের জন্য ব্যবহার করা হচ্ছে এবং হুগেটেবলের উপরের ইনডেক্স স্ক্যানটি 480 বার কার্যকর করা হচ্ছে (প্রতিটি ছোট সারিটির জন্য # ছোট)। এটি আমার কাছে পেছনের দিকে মনে হচ্ছে, সুতরাং আমি পরিবর্তে একটি সংযুক্তি যোগদানের জন্য জোর করে চেষ্টা করার চেষ্টা করেছি:
select
b.stuff,
a.added,
a.value
from
dbo.hugetable a with(index = ix_hugetable)
inner merge join
#smalltable b with(index(1)) on a.fk = b.pk
where
a.added between @start and @end;
প্রশ্নের সূচক (সম্পূর্ণ সংজ্ঞায়িতের জন্য নীচে দেখুন) কলামগুলি কভার fk (যোগদানের পূর্বাভাস ) কভার করেছে , যোগ করা হয়েছে (যেখানে অনুচ্ছেদে ব্যবহৃত হয়েছে) এবং আইডি (অকেজো) আরোহী ক্রমে, এবং মান অন্তর্ভুক্ত ।
আমি যখন এটি করি, তবে, ক্যোয়ারিটি 2 1/2 মিনিট থেকে 9 এর ওপরে শুরু হয়ে যায় I আমি আশা করতাম যে ইঙ্গিতগুলি আরও দক্ষতার সাথে যোগ দিতে বাধ্য করবে যা প্রতিটি টেবিলের উপরে কেবল একটি পাস করবে, তবে স্পষ্টভাবে নয়।
কোন গাইডেন্স স্বাগত। প্রয়োজনে অতিরিক্ত তথ্য সরবরাহ করা।
আপডেট (2011/06/02)
টেবিলে সূচকগুলি পুনর্গঠিত করে, আমি উল্লেখযোগ্য পারফরম্যান্স ইনড্রোড করেছি, তবে বিশাল টেবিলে ডেটা সংক্ষিপ্ত করার ক্ষেত্রে আমি একটি নতুন বাধা পেয়েছি। ফলাফলটি মাসের দ্বারা সংক্ষিপ্তসার, যা বর্তমানে নীচের মত দেখাচ্ছে:
select
b.stuff,
datediff(month, 0, a.added),
count(a.value),
sum(case when a.value > 0 else 1 end) -- this triples the running time!
from
dbo.hugetable a
inner join
#smalltable b on a.fk = b.pk
group by
b.stuff,
datediff(month, 0, a.added);
বর্তমানে hugetable ক্লাস্টার সূচক আছে pk_hugetable (added, fk)
(প্রাথমিক কী), এবং একটি অ-ক্লাস্টার সূচক অন্যান্য উপায় যাচ্ছে ix_hugetable (fk, added)
।
উপরের চতুর্থ কলাম ব্যতীত, অপটিমাইজারটি বাইরের ইনপুট হিসাবে # স্মার্ট টেবিলটি ব্যবহার করে আগের মতো নেস্টেড লুপ জোড় ব্যবহার করে এবং একটি ক্লাস্টারযুক্ত সূচকটি অভ্যন্তরীণ লুপ হিসাবে সন্ধান করে (আবার 480 বার কার্যকর করে)। আমার সম্পর্কে যা উদ্বেগ তা হ'ল আনুমানিক সারিগুলির মধ্যে বৈষম্য (12,958.4) এবং আসল সারি (74,668,468)। এই সন্ধানগুলির আপেক্ষিক ব্যয় 45%। চলমান সময়টি এক মিনিটের মধ্যেই।
চতুর্থ কলামের সাথে, চলমান সময়টি 4 মিনিট পর্যন্ত বেড়ে যায়। এটি এবার একই আপেক্ষিক ব্যয়ের (৪৫%) ক্লাস্টারড ইনডেক্সে অনুসন্ধান করেছে, একটি হ্যাশ ম্যাচ (৩০%) এর মাধ্যমে সমষ্টি করে, তারপরে একটি হ্যাশ # স্মার্ট টেবিল (0%) এ যোগ দেয়।
আমার পরবর্তী কর্মক্রম সম্পর্কে আমি অনিশ্চিত। আমার উদ্বেগটি হ'ল যে তারিখের সীমা অনুসন্ধান বা যোগদানের প্রাকটিকাকে অবশ্যই গ্যারান্টিযুক্ত নয় এমনকি ফলাফলের সেটটি হ্রাস করতে পারে এমন সমস্ত কিছুর সম্ভাবনা রয়েছে। বেশিরভাগ ক্ষেত্রে তারিখের সীমাটি সম্ভবত 10-15% রেকর্ডগুলি ছাঁটাই করবে এবং fk এ অভ্যন্তরীণ যোগটি সম্ভবত 20-30% ছাঁটাই করতে পারে।
উইল এ দ্বারা অনুরোধ করা হিসাবে, এর ফলাফল sp_spaceused
:
name | rows | reserved | data | index_size | unused
hugetable | 261774373 | 93552920 KB | 18373816 KB | 75167432 KB | 11672 KB
# স্মার্ট টেবিল হিসাবে সংজ্ঞায়িত করা হয়:
create table #endpoints (
pk uniqueidentifier primary key clustered,
stuff varchar(6) null
);
যখন dbo.hugetable হিসাবে সংজ্ঞায়িত করা হয়:
create table dbo.hugetable (
id uniqueidentifier not null,
fk uniqueidentifier not null,
added datetime not null,
value decimal(13, 3) not null,
constraint pk_hugetable primary key clustered (
fk asc,
added asc,
id asc
)
with (
pad_index = off, statistics_norecompute = off,
ignore_dup_key = off, allow_row_locks = on,
allow_page_locks = on
)
on [primary]
)
on [primary];
নিম্নলিখিত সূচক সংজ্ঞায়িত সহ:
create nonclustered index ix_hugetable on dbo.hugetable (
fk asc, added asc, id asc
) include(value) with (
pad_index = off, statistics_norecompute = off,
sort_in_tempdb = off, ignore_dup_key = off,
drop_existing = off, online = off,
allow_row_locks = on, allow_page_locks = on
)
on [primary];
আইডি ক্ষেত্র অপ্রয়োজনীয়, একটি পূর্ববর্তী DBA যারা দৃঢ় বিশ্বাস থেকে একটি হস্তনির্মিত বস্তু হল সব টেবিল সর্বত্র একটি GUID, কোন ব্যতিক্রম থাকতে হবে।