বালির বস্তা
এ শীর্ষস্থানীয় কোয়ালিটির ব্লগ Posts® কাজ করার সময় আমি কিছু অপটিমাইজার আচরণ আমি সত্যিই পাওয়া জুড়ে এসেছিল infuriating আকর্ষণীয়। আমার তাত্ক্ষণিকভাবে কোনও ব্যাখ্যা নেই, কমপক্ষে একটিতেও আমি খুশি নই, সুতরাং কেউ স্মার্ট দেখাতে চাইলে আমি এটি এখানে রাখছি।
আপনি যদি পাশাপাশি যেতে চান তবে আপনি এখানে স্ট্যাক ওভারফ্লো ডেটা ডাম্পের 2013 সংস্করণটি ধরতে পারেন । আমি মন্তব্য সারণি ব্যবহার করছি, এটিতে একটি অতিরিক্ত সূচক।
CREATE INDEX [ix_ennui] ON [dbo].[Comments] ( [UserId], [Score] DESC );
প্রশ্ন এক
আমি যখন টেবিলটির মতো জিজ্ঞাসা করি তখন আমি একটি বিজোড় কোয়েরি প্ল্যান পাই ।
WITH x
AS
(
SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
ORDER BY c.Score DESC
)
SELECT *
FROM x
WHERE x.Score >= 500;
স্কোরের SARGable ভবিষ্যদ্বাণী সিটিই-র ভিতরে ধাক্কা দেয় না। এটি পরিকল্পনার অনেক পরে ফিল্টার অপারেটরে রয়েছে।
ORDER BY
ফিল্টার হিসাবে একই কলামে যেহেতু আমি অদ্ভুত বলে মনে করি ।
প্রশ্ন দুটি
আমি যদি ক্যোয়ারী পরিবর্তন করি তবে তা ধাক্কা খায় না।
WITH x
AS
(
SELECT c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
)
SELECT TOP 101 *
FROM x
WHERE x.Score >= 500
ORDER BY x.Score DESC;
ক্যোয়ারী পরিকল্পনা পরিবর্তন , খুব, এবং ডিস্কে কোন বিষ্ফোরণের সাথে অনেক দ্রুততর রান। নন ক্ল্লাস্টারড ইনডেক্স স্ক্যানের প্রিডিকেট সহ তারা উভয়ই একই ফলাফল উত্পাদন করে।
প্রশ্ন তিন
এটি কোয়েরিটি লেখার সমতুল্য:
SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
WHERE c.Score >= 500
ORDER BY c.Score DESC;
প্রশ্ন চার
উদ্ভূত টেবিলটি ব্যবহার করা প্রাথমিক সিটিই কোয়েরির মতো একই "খারাপ" ক্যোয়ারী প্ল্যান পায়
SELECT *
FROM ( SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
ORDER BY c.Score DESC ) AS x
WHERE x.Score >= 500;
বিষয়গুলি আরও অচল হয়ে যায় যখন ...
আমি ডেটা আরোহণের জন্য ক্যোয়ারী এবং ফিল্টারটিতে পরিবর্তন করি <=
।
এই প্রশ্নটিকে দীর্ঘায়িত করা থেকে দূরে রাখতে, আমি সবকিছু একসাথে রেখে যাচ্ছি।
ক্যোয়ারী
--Derived table
SELECT *
FROM ( SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
ORDER BY c.Score ASC ) AS x
WHERE x.Score <= 500;
--TOP inside CTE
WITH x
AS
(
SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
ORDER BY c.Score ASC
)
SELECT *
FROM x
WHERE x.Score <= 500;
--Written normally
SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
WHERE c.Score <= 500
ORDER BY c.Score ASC;
--TOP outside CTE
WITH x
AS
(
SELECT c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
)
SELECT TOP 101 *
FROM x
WHERE x.Score <= 500
ORDER BY x.Score ASC;
পরিকল্পনা সমূহ
নোট করুন যে এই প্রশ্নের কোনওটিই অবিচ্ছিন্ন সূচকের সুবিধা গ্রহণ করে না - এখানে কেবলমাত্র পরিবর্তন ঘটে তা ফিল্টার অপারেটরের অবস্থান। কোনও অবস্থাতেই সূচক অ্যাক্সেসের জন্য প্রিকেটটিকে ধাক্কা দেওয়া হয় না।
একটি প্রশ্ন হাজির!
এমন কোনও কারণ আছে যে কোনও SARGable প্রিনিকেট অন্য পরিস্থিতিতে নয়, কিছু পরিস্থিতিতে ঠেলা যায়? উত্থাপিত ক্রম অনুসারে বাছাই করা প্রশ্নের মধ্যে পার্থক্যগুলি আকর্ষণীয়, তবে উদ্ভুত আরোহণকারী এবং তাদের মধ্যে পার্থক্যগুলি।
আগ্রহী প্রত্যেকের জন্য, এখানে কেবলমাত্র একটি সূচক সহ পরিকল্পনা রয়েছে Score
: