এসকিউএল সার্ভার সূচকগুলি - আরোহী বা উতরাই, এটি কী তফাত করে?


138

আপনি যখন এমএস এসকিউএল সার্ভারে কলাম বা কলামগুলির সংখ্যায় একটি সূচক তৈরি করেন (আমি সংস্করণ 2005 ব্যবহার করছি), আপনি নির্দিষ্ট করতে পারেন যে প্রতিটি কলামের সূচকটি হয় আরোহী বা উতরাই হোক। এই পছন্দটি কেন এখানে রয়েছে তা বুঝতে আমার খুব কষ্ট হচ্ছে। বাইনারি বাছাই করার কৌশলগুলি ব্যবহার করে, কোনও চেহারা কি ঠিক তত দ্রুত হয় না? আমি কোন অর্ডারটি পছন্দ করি তাতে কোন পার্থক্য রয়েছে?


উত্তর:


136

সম্মিলিত সূচকগুলির সাথে ব্যবহৃত হলে এটি মূলত গুরুত্বপূর্ণ:

CREATE INDEX ix_index ON mytable (col1, col2 DESC);

উভয় জন্য ব্যবহার করা যেতে পারে:

SELECT  *
FROM    mytable
ORDER BY
        col1, col2 DESC

বা:

SELECT  *
FROM    mytable
ORDER BY
        col1 DESC, col2

, তবে এর জন্য নয়:

SELECT  *
FROM    mytable
ORDER BY
        col1, col2

একক কলামে একটি সূচক দক্ষতার সাথে উভয় উপায়ে বাছাইয়ের জন্য ব্যবহার করা যেতে পারে।

বিস্তারিত জানতে আমার ব্লগে নিবন্ধটি দেখুন:

হালনাগাদ:

বাস্তবে, এটি একক কলাম সূচীর পক্ষেও গুরুত্বপূর্ণ, যদিও এটি এতটা সুস্পষ্ট নয়।

একটি ক্লাস্টার্ড টেবিলের একটি কলামে একটি সূচি কল্পনা করুন:

CREATE TABLE mytable (
       pk INT NOT NULL PRIMARY KEY,
       col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)

উপর সূচক col1মান আদেশ রাখে col1সারি উল্লেখ করেন।

যেহেতু টেবিল ক্লাস্টার হয়, সারি উল্লেখ আসলে এর মান pk। এগুলি প্রতিটি মানের মধ্যে অর্ডার করা হয় col1

এর অর্থ এই যে সূচকের পাতাগুলি আসলে অর্ডার করা হয়েছে (col1, pk)এবং এই ক্যোয়ারী:

SELECT  col1, pk
FROM    mytable
ORDER BY
        col1, pk

কোন বাছাই প্রয়োজন।

আমরা যদি সূচকে নিম্নলিখিত হিসাবে তৈরি করি:

CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)

তারপরে, এর মানগুলি col1অবতরণ অনুসারে বাছাই করা হবে তবে pkপ্রতিটি মানের মধ্যে মানগুলি col1ক্রমবর্ধমান বাছাই করা হবে।

এর অর্থ নিম্নলিখিত কোয়েরি:

SELECT  col1, pk
FROM    mytable
ORDER BY
        col1, pk DESC

দ্বারা পরিবেশন করা যেতে পারে ix_mytable_col1_descকিন্তু দ্বারা না ix_mytable_col1

অন্য কথায়, যে CLUSTERED INDEXকোনও কলামে কলামগুলি অবিচ্ছিন্ন থাকে সেই টেবিলে সর্বদা অন্য সূচকের পিছনে থাকা কলামগুলি থাকে are


1
আপনি যখন "এর জন্য নয় ..." বলছেন তখন আপনি কি বোঝাতে চাইছেন যে এটি কাজ করবে না বা অভিনয়টি ভয়াবহ হবে?
নিল এন

5
আমি বলতে চাইছি যে সূচিটি ক্যোয়ারির জন্য ব্যবহৃত হবে না। কোয়েরিটি নিজেই কাজ করবে তবে অবশ্যই কার্য সম্পাদন খারাপ হবে।
কাসনসুই

1
প্রথম বিভাগে, দ্বিতীয় উদাহরণটি "অর্ডার বাই কল 1 ডিইএসসি, কোল 2 ডিইএসসি" না বলা উচিত?
মিচ গম

71

সত্যিকারের একক কলাম সূচকের জন্য এটি ক্যোরি অপটিমাইজারের দৃষ্টিকোণ থেকে সামান্য পার্থক্য করে।

টেবিল সংজ্ঞা জন্য

CREATE TABLE T1( [ID] [int] IDENTITY NOT NULL,
                 [Filler] [char](8000) NULL,
                 PRIMARY KEY CLUSTERED ([ID] ASC))

প্রশ্ন

SELECT TOP 10 *
FROM T1
ORDER BY ID DESC

BACKWARDএক্সিকিউশন প্ল্যানে দেখা যেতে পারে স্ক্যানের দিকনির্দেশ সহ একটি অর্ডার করা স্ক্যান ব্যবহার করে । এতে সামান্য পার্থক্য রয়েছে তবে বর্তমানে কেবলমাত্র FORWARDস্ক্যানগুলিই সমান্তরাল হতে পারে।

পরিকল্পনা

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

বিভাজন ফলাফল দেখুন

                    avg_fragmentation                    avg_fragment
name   page_count   _in_percent         fragment_count   _size_in_pages
------ ------------ ------------------- ---------------- ---------------
T1     1000         0.4                 5                200
T2     1000         99.9                1000             1

নীচের স্ক্রিপ্ট জন্য

/*Uses T1 definition from above*/
SET NOCOUNT ON;

CREATE TABLE T2( [ID] [int] IDENTITY NOT NULL,
                 [Filler] [char](8000) NULL,
                 PRIMARY KEY CLUSTERED ([ID] DESC))

BEGIN TRAN

GO
INSERT INTO T1 DEFAULT VALUES
GO 1000
INSERT INTO T2 DEFAULT VALUES
GO 1000

COMMIT

SELECT object_name(object_id) AS name, 
       page_count, 
       avg_fragmentation_in_percent, 
       fragment_count, 
       avg_fragment_size_in_pages 
FROM 
sys.dm_db_index_physical_stats(db_id(), object_id('T1'), 1, NULL, 'DETAILED') 
WHERE  index_level = 0 
UNION ALL 
SELECT object_name(object_id) AS name, 
       page_count, 
       avg_fragmentation_in_percent, 
       fragment_count, 
       avg_fragment_size_in_pages 
FROM 
sys.dm_db_index_physical_stats(db_id(), object_id('T2'), 1, NULL, 'DETAILED') 
WHERE  index_level = 0 

অনুমানটি যাচাই করার জন্য স্থানিক ফলাফলের ট্যাবটি ব্যবহার করা সম্ভব কারণ এটি পরবর্তী পৃষ্ঠাগুলিতে উভয় ক্ষেত্রেই মূল মানগুলি রয়েছে।

SELECT page_id,
       [ID],
       geometry::Point(page_id, [ID], 0).STBuffer(4)
FROM   T1
       CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
UNION ALL
SELECT page_id,
       [ID],
       geometry::Point(page_id, [ID], 0).STBuffer(4)
FROM   T2
       CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )

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


এই দুর্দান্ত
টিআইপিটির

আমি অবাক হয়েছি যদি আমার একটি অবতরণ সূচক রয়েছে, তবে মাইটিবেল থেকে মাইকোলনম নির্বাচন করুন যেখানে ইনডেক্সড_ক্লোনম = \ @ মাইভ্যালু যখন faster @ মাইভ্যালু ন্যূনতম সম্ভাব্য মানটির সাথে বন্ধ থাকে তখন সেক্ষেত্রে সর্বাধিক সম্ভাব্য মানের নিকটে থাকে।
লাজোস আরপাদ

@ লাওসআরপ্যাড? বি গাছগুলি ভারসাম্যযুক্ত গাছ। গাছের গভীরতা উভয়ের জন্য একই।
মার্টিন স্মিথ

@ মার্টিনস্মিতের গভীরতা একই, তবে আমি সন্দেহ করি ভাইবোনদের ক্রমটি কোনও প্রভাব ফেলবে না
লাজোস আরপাদ

@ মার্টিনস্মিথ, যদি ভাই-বোনদের ক্রমানুসারে পারফরম্যান্সে সামান্য পার্থক্য থাকে, তবে লক্ষ লক্ষ বাছাই করা চালানো যোগ হবে, বহুমাত্রিক যোগদানের কথা উল্লেখ না করে।
লাজোস আরপাদ

8

আপনি স্বতন্ত্র রেকর্ড নয়, প্রচুর পরিমাণে সাজানো ডেটা পুনরুদ্ধার করতে চাইলে সাজানোর অর্ডারের বিষয়টি গুরুত্বপূর্ণ।

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

@ কাসনোই কখন তা বিবেচনা করে তার দুর্দান্ত উদাহরণ দেয়

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