ইতিমধ্যে ক্লাস্টারড সূচকের অংশ নন ক্লাস্টারড সূচক


9

আমি একটি ধীর চলমান ক্যোয়ারী ডিবাগ করছি এবং সম্পাদনের পরিকল্পনায় একটি ক্লাস্টারযুক্ত সূচকের প্রস্তাব দেওয়া হয়েছে, 51.6648 ইমপ্যাক্ট সহ। তবে, ক্লাস্টারবিহীন সূচীতে কেবলমাত্র কলামগুলি অন্তর্ভুক্ত রয়েছে যা ইতিমধ্যে প্রাথমিক কী (পিকে) কম্পোজিট ক্লাস্টার ইনডেক্সে রয়েছে।

এটি কি সূচকের কলামগুলির ক্রমের কারণে হতে পারে? অর্থাৎ যদি ক্লাস্টারড ইনডেক্সের কলামগুলি বেশিরভাগ সিলেক্টিক থেকে কমপক্ষে পর্যায়ে না থাকে তবে নন-ক্লাস্টারড ইনডেক্সের কার্যকারিতা উন্নত করার সম্ভাবনা কি আছে?

এছাড়াও অ-ক্লাস্টারযুক্ত সূচকগুলিতে কেবলমাত্র অন্তর্ভুক্ত কলাম হিসাবে তৃতীয় যুক্ত হওয়া তিনটি পিকে কলামের মধ্যে দুটি রয়েছে। includeনন-ক্লাস্টারড ইনডেক্সের ব্যবহার আরও অনুকূল হতে পারে তার অন্য কারণ কি ?

নীচে আমি যে টেবিল কাঠামোর সাথে কাজ করছি তার একটি উদাহরণ দেওয়া হল:

Tables-

Retailers (
    RetailerID int PK, 
    name ...)

Retailer_Relation_Types (
    RelationType smallint PK, 
    Description nvarchar(50) ...)

Retailer_Relations (
    RetailerID int PK FK, 
    RelatedRetailerID int PK FK, 
    RelationType smallint PK FK, 
    CreatedOn datetime ...)

সারণীতে Retailer_Relationsনিম্নলিখিত সম্মিলিত পিকে সূচক এবং প্রস্তাবিত সূচক-

CONSTRAINT PK_Retailer_Relations 
PRIMARY KEY CLUSTERED (
    RetailerID ASC, 
    RelatedRetailerID ASC, 
    RelationType ASC
    ) ON [PRIMARY]

CREATE NONCLUSTERED INDEX <NameOfIndex> 
ON Retailer_Relations (
    RetailerID, 
    RelationType
    ) 
INCLUDE (
    RelatedRetailerID
    )

উত্তর:


12

টেবিলটি খুচরা বিক্রেতা_ সম্পর্কিতগুলি নিম্নলিখিত সম্মিলিত পিকে সূচক এবং প্রস্তাবিত সূচক-

অনুপস্থিত সূচীগুলি সহায়ক হতে পারে এবং অবশ্যই কাজ করতে পারে, আমি অনুপস্থিত সূচকগুলিতে খুব বেশি সময় ব্যয় করব না, এই ইঙ্গিতগুলি প্রকৃত বাস্তবায়ন পরিকল্পনার পরিবর্তে নয়, আনুমানিক বাস্তবায়ন পরিকল্পনায় তৈরি করা হয়েছে।

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

ফলস্বরূপ তারা খুব ভুল হতে পারে। আপনি যদি অনিশ্চিত হন যে এটি যদি সহায়তা করে চলেছে, তবে সবচেয়ে ভাল কাজটি হ'ল আগে এবং পরে পরিস্থিতি পরীক্ষা করা। আপনি SET STATISTICS IO, TIME ON;কোয়েরি চালানোর আগে বিবৃতি যোগ করে এটি করতে পারেন ।

এছাড়াও, আপনি এই পরিসংখ্যানগুলি পড়তে আরও সহজ করার জন্য স্ট্যাটিস্টিক পার্সার ব্যবহার করতে পারেন ।

এটি কি সূচকের কলামগুলির ক্রমের কারণে হতে পারে?

এটি সঠিক, অনুপস্থিত সূচী তৈরি করা প্রশ্নগুলিতে নির্বাচনগুলি উন্নত করতে পারে, উদাহরণস্বরূপ যদি আপনার ক্যোয়ারীটি এমন দেখাচ্ছে:

SELECT  RelatedRetailerID
FROM Retailer_Relations 
WHERE
RetailerID = 5 AND
RelationType = 20;

বা এই মত:

SELECT  RelatedRetailerID
FROM Retailer_Relations 
ORDER BY
RetailerID,
RelationType;

এর পিছনে যুক্তিটি হ'ল উভয় সূচীই খুচরা বিক্রেতা আইডিতে সন্ধান করতে পারে, সেই অংশটি পরিবর্তন হতে পারে না। তবে রিলেশনটাইপ-এ অতিরিক্ত ফিল্টার / অর্ডারিং প্রয়োগ করা হলে কী হবে? এটি ক্লাস্টারড ইনডেক্সের পুরো জায়গা জুড়ে থাকবে, ফলস্বরূপ এটি তৃতীয় কী মান হবে, দ্বিতীয় কী মান নয়। এবং যেমনটি আমরা জানি, এটি এনসিআইয়ের দ্বিতীয় কী মান।

ঠিক আছে, তবে কখন বা কীভাবে অবিবাহিত সূচি কোয়েরিটি উন্নত করবে?

কয়েকটি মামলা হতে পারে:

  • যদি রিলেশনটাইপ অনেকগুলি মান ফিল্টার করে, অবশিষ্ট I / O উচ্চতর হতে পারে, ফলে অবিবাহিত সূচকের সম্ভাব্য প্রয়োজন হয় (ক্যোয়ারী # 1)
  • দুটি কলামে অর্ডারিং ঘটে (এক উপায়), এবং ফলাফলটি বড় (ক্যোয়ারী # 2)।
  • যেমন @ অ্যারোনবার্ট্র্যান্ড উল্লেখ করেছে: এনসিআইয়ের তুলনায় সিআই আকারের পার্থক্য যদি যথেষ্ট পরিমাণে হয় তবে এনসিআই যুক্ত করলে তাতে উপকৃত প্রশ্নের দ্বারা পড়া পৃষ্ঠাগুলি হ্রাস পাবে।

এনসিআই সাইড নোট

পার্শ্ব নোট হিসাবে, আপনার এনসিআইতে অন্তর্ভুক্ত তালিকায় কী কলামগুলি যুক্ত করা ঠিক তেমন প্রয়োজন হয় না, যেহেতু সিআই কী কলামগুলি স্বয়ংক্রিয়ভাবে সমস্ত নন ক্লাস্টারযুক্ত সূচকে অন্তর্ভুক্ত থাকে।

যদি আপনি নিশ্চিত না হন যে ক্লাস্টারড সূচকটি একই থাকবে এবং আপনি কলামটি সর্বদা অন্তর্ভুক্ত থাকতে চান তবে আপনি এটি করতে বেছে নিতে পারেন।

নিজেই ক্যোয়ারির বিষয়ে, আপনি যদি পেস্টেপ্লোনের মাধ্যমে কার্যকরকরণ পরিকল্পনাটি যুক্ত করেন তবে আমরা কোয়েরিটিকে সূচীকরণ / উন্নত করার বিষয়ে আরও কিছু তথ্য দিতে পারি।


পরীক্ষামূলক

টেবিল তৈরি করুন এবং কয়েকটি সারি যুক্ত করুন

CREATE TABLE Retailer_Relations (
    RetailerID int , 
    RelatedRetailerID int , 
    RelationType smallint, 
    CreatedOn datetime,
    CONSTRAINT PK_Retailer_Relations 
PRIMARY KEY CLUSTERED (
    RetailerID ASC, 
    RelatedRetailerID ASC, 
    RelationType ASC
    ) ON [PRIMARY])


    DECLARE @I Int = 1
    WHILE @I < 1000
    BEGIN
    INSERT INTO Retailer_Relations(RetailerID,RelatedRetailerID,RelationType,CreatedOn)
    VALUES(@I,@I,@I,GETDATE()
    )
    set @I += 1
    END

প্রশ্ন # 1

    SELECT  RelatedRetailerID
FROM Retailer_Relations 
WHERE
RetailerID = 5 AND
RelationType = 20;

সূচী ছাড়াই পরিকল্পনা করুন এখানে

এটি যখন সন্ধান করছে তখন এটি খুচরা বিক্রেতা আইডিতে একটি অনুসন্ধান করছে। এরপরে এটি রিলেশনটাইপ-এ একটি অবশিষ্ট অবশিষ্ট আই / ও প্রিকিকেট জারি করা হচ্ছে

সূচি যোগ করুন

CREATE NONCLUSTERED INDEX IX_TEST
ON Retailer_Relations (
    RetailerID, 
    RelationType
    ) 
INCLUDE (
    RelatedRetailerID
    )

উভয় কলামে অবশেষের প্রাকটিকালটি চলে গেছে, একটি অনুসন্ধানের শিকারে সবকিছু ঘটে যায়।

হত্যা পরিকল্পনা

দ্বিতীয় ক্যোয়ারির সাথে, যুক্ত সূচক সাহায্যকারীতা আরও স্পষ্ট হয়ে ওঠে:

SELECT  RelatedRetailerID
FROM Retailer_Relations 
ORDER BY
RetailerID,
RelationType;

বাছাই করা অপারেটরের সাথে সূচক ছাড়াই পরিকল্পনা করুন:

এখানে চিত্র বর্ণনা লিখুন

সূচকের সাথে পরিকল্পনা করুন, সূচীটি ব্যবহার করে বাছাই করা অপারেটরটি সরানো হবে

এখানে চিত্র বর্ণনা লিখুন


1
ধন্যবাদ রান্দি, আমি এটিকে উত্তর হিসাবে চিহ্নিত করব তবে কেবল জিজ্ঞাসা করতে চেয়েছি আপনি কী অনুপস্থিত সূচকের পরামর্শটি আনুমানিক বাস্তবায়ন পরিকল্পনার ভিত্তিতে তৈরি করছেন? এটি এসএস2016-এর প্রকৃত বাস্তবায়ন পরিকল্পনায় যেমন প্রদর্শিত হয়েছে তেমনটি আমি জিজ্ঞাসা করি।
ফ্লেচ

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