সারগেইবল পূর্বাভাসগুলি কখন সিটিই বা উত্পন্ন টেবিলের দিকে ঠেলে দেওয়া যায়?


15

বালির বস্তা

এ শীর্ষস্থানীয় কোয়ালিটির ব্লগ 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:

উত্তর:


11

এখানে বেশ কয়েকটি সমস্যা রয়েছে are

পুশিং অতীতের পূর্বাভাস দেয় TOP

অপ্টিমাইজার বর্তমানে কোনও ভবিষ্যদ্বাণীক অতীতকে ধাক্কা দিতে পারে না TOP, এমনকি সীমিত ক্ষেত্রে যেখানে এটি করা নিরাপদ হবে *। এই সীমাবদ্ধতা প্রশ্নটির সমস্ত প্রশ্নগুলির আচরণের জন্য দায়বদ্ধ যেখানে ভবিষ্যদ্বাণীটি এর চেয়ে উচ্চতর স্কোপে রয়েছে TOP

চারপাশের কাজটি হ'ল ম্যানুয়ালি পুনরায় লেখার কাজ করা। মৌলিক বিষয়টি যেমন উইন্ডো ফাংশন অতীত পূর্বাভাস পুশ করার ক্ষেত্রে অনুরূপ , এর সাথে সম্পর্কিত কোনও বিশেষ নিয়ম নেই SelOnSeqPrj

আমার ব্যক্তিগত মতামতটি হল যে অন্বেষণের মতো নিয়মটি SelOnTopবাস্তবায়িত হয় না কারণ লোকেরা ইচ্ছাকৃতভাবে TOPএক ধরণের 'অপ্টিমাইজেশন বেড়া' সরবরাহ করার প্রয়াসে প্রশ্নগুলি লিখেছেন ।

* সাধারণত এর অর্থ হ'ল শিকারীর ORDER BYসাথে সম্পর্কিত দফাটিতে উপস্থিত হওয়া উচিত TOPএবং যে কোনও অসমতার দিক বাছাইয়ের দিকের সাথে একমত হওয়া উচিত। রূপান্তরটির জন্য এসকিউএল সার্ভারে NUL গুলি বাছাইয়ের আচরণের জন্য অ্যাকাউন্ট করা দরকার। সামগ্রিকভাবে, সীমাবদ্ধতাগুলির অর্থ সম্ভবত অতিরিক্ত অন্বেষণ প্রচেষ্টা যথাযথ করার জন্য এই রূপান্তরটি বাস্তবে যথেষ্ট কার্যকর হবে না।

মূল্য ব্যয়

Scoreকলামে মানগুলি বিতরণের (আরও অনেক সারি <= 500 এর তুলনায়> = 500), এবং দ্বারা প্রবর্তিত সারি লক্ষ্যটির প্রভাবের কারণে প্রশ্নের বাকী কার্যকর প্রয়োগের পরিকল্পনাগুলি ব্যয়ভিত্তিক পছন্দ হিসাবে ব্যাখ্যা করা যেতে পারে TOP

উদাহরণস্বরূপ, ক্যোয়ারী:

--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;

... একটি ফিল্টারটিতে আপাতদৃষ্টিতে আনপিশড শিকারের একটি পরিকল্পনা তৈরি করে:

সারি গোলের কারণে দেরীতে ফিল্টার

নোট করুন যে সাজানটি 101 টি সারি উত্পাদন করে বলে অনুমান করা হয়। এটি শীর্ষ দ্বারা যুক্ত করা সারি গোলের প্রভাব। এটি বাছাইয়ের আনুমানিক ব্যয়কে প্রভাবিত করে এবং ফিল্টারটিকে এটি যথেষ্ট সস্তা বিকল্প বলে মনে করার জন্য যথেষ্ট পরিমাণে প্রভাব ফেলে। এই পরিকল্পনার আনুমানিক ব্যয় 2401.39 ইউনিট।

যদি আমরা কোনও প্রশ্নের ইঙ্গিত দিয়ে সারি লক্ষ্যগুলি অক্ষম করে থাকি:

--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
OPTION (USE HINT ('DISABLE_OPTIMIZER_ROWGOAL'));

... উত্পাদিত কার্যকরকরণ পরিকল্পনাটি হ'ল:

সারি লক্ষ্য ছাড়াই পরিকল্পনা করুন

শিকারীটিকে অবশিষ্টাংশহীন অ-সরগযোগ্য শিকারী হিসাবে স্ক্যানের দিকে ঠেলে দেওয়া হয়েছে এবং পুরো পরিকল্পনার ব্যয় 2402.32 ইউনিট।

লক্ষ্য করুন যে <= 500প্রিডিকেটটি কোনও সারি ফিল্টার করবে বলে আশা করা যায় না। আপনি যদি একটি ছোট সংখ্যা পছন্দ করেন, যেমন <= 50, সারি লক্ষ্য প্রভাব নির্বিশেষে অপ্টিমাইজারটি ধাক্কা-শিকারী পরিকল্পনা পছন্দ করত।

কোয়েরি Score DESCএবং একটি 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 DESC;

এখন শিকারীটি খুব নির্বাচিত হবে বলে আশা করা হচ্ছে, সুতরাং অপ্টিমাইজারটি প্রিনিকেটটিকে ধাক্কা দেয় এবং লুক্কুলের সাথে অবিচ্ছিন্ন সূচকটি ব্যবহার করে:

নির্বাচনী ভবিষ্যদ্বাণী

আবারও, অপ্টিমাইজার একাধিক বিকল্প বিবেচনা করেছে এবং যথারীতি এটি আপাতদৃষ্টিতে সস্তার বিকল্প হিসাবে বেছে নিয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.