অপ্টিমাইজার কেন ক্লাস্টারযুক্ত সূচক + নন-ক্লাস্টারড ইনডেক্সের পরিবর্তে বাছাই করবে?


11

পরবর্তী উদাহরণ দেওয়া:

IF OBJECT_ID('dbo.my_table') IS NOT NULL
    DROP TABLE [dbo].[my_table];
GO

CREATE TABLE [dbo].[my_table]
(
    [id]    int IDENTITY (1,1)  NOT NULL PRIMARY KEY,
    [foo]   int                 NULL,
    [bar]   int                 NULL,
    [nki]   int                 NOT NULL
);
GO

/* Insert some random data */
INSERT INTO [dbo].[my_table] (foo, bar, nki)
SELECT TOP (100000)
    ABS(CHECKSUM(NewId())) % 14,
    ABS(CHECKSUM(NewId())) % 20,
    n = CONVERT(INT, ROW_NUMBER() OVER (ORDER BY s1.[object_id]))
FROM 
    sys.all_objects AS s1 
CROSS JOIN 
    sys.all_objects AS s2
GO

CREATE UNIQUE NONCLUSTERED INDEX [IX_my_table]
    ON [dbo].[my_table] ([nki] ASC);
GO

আমি আদেশিত সমস্ত রেকর্ড যদি আনা হয় [nki] (নন-ক্লাস্টারড ইনডেক্স) আনে:

SET STATISTICS TIME ON;
SELECT id, foo, bar, nki FROM my_table ORDER BY nki;
SET STATISTICS TIME OFF;

SQL Server Execution Times: CPU time = 266 ms, elapsed time = 493 ms

অপ্টিমাইজার ক্লাস্টারড ইনডেক্স চয়ন করে এবং তারপর একটি বাছাই করা অ্যালগরিদম প্রয়োগ করে।

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

Execution plan

তবে আমি যদি এটি ক্লাস্টারবিহীন সূচকটি ব্যবহার করতে বাধ্য করি:

SET STATISTICS TIME ON;
SELECT id, foo, bar, nki FROM my_table WITH(INDEX(IX_my_TABLE));
SET STATISTICS TIME OFF;

SQL Server Execution Times: CPU time = 311 ms, elapsed time = 188 ms

তারপরে এটি কোনও কী লুকআপ সহ ক্লাস্টারবিহীন সূচক ব্যবহার করে:

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

Execution plan

স্পষ্টতই যদি নন-ক্লাস্টারড সূচকটি একটি আচ্ছাদন সূচীতে রূপান্তরিত হয়:

CREATE UNIQUE NONCLUSTERED INDEX [IX_my_table]
    ON [dbo].[my_table] ([nki] ASC)
    INCLUDE (id, foo, bar);
GO

তারপরে এটি কেবল এই সূচকটি ব্যবহার করে:

SET STATISTICS TIME ON;
SELECT id, foo, bar, nki FROM my_table ORDER BY nki;
SET STATISTICS TIME OFF;

SQL Server Execution Times: CPU time = 32 ms, elapsed time = 106 ms

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

Execution plan


প্রশ্ন

  • এসকিউএল সার্ভার কেন ক্লাস্টারড ইনডেক্স এবং ক্লাস্টারবিহীন সূচক ব্যবহারের পরিবর্তে একটি ধরণের অ্যালগরিদম ব্যবহার করে এমনকি যদি মৃত্যুর পরে কার্যকর ক্ষেত্রে 38% দ্রুত হয়?

1
আপনার বাধ্য-সূচক ক্যোয়ারিতে অর্ডারটি ছেড়ে দেওয়ার অর্থ কি?
ফরেষ্ট

উত্তর:


9

এসকিউএল সার্ভার কেন ক্লাস্টারড ইনডেক্স এবং ক্লাস্টারবিহীন সূচক ব্যবহারের পরিবর্তে একটি ধরণের অ্যালগরিদম ব্যবহার করে এমনকি যদি মৃত্যুর পরে কার্যকর ক্ষেত্রে 38% দ্রুত হয়?

কারণ এসকিউএল সার্ভার রানটাইম তথ্য নয়, পরিসংখ্যানের ভিত্তিতে ব্যয়ভিত্তিক অপ্টিমাইজার ব্যবহার করে।

এই ক্যোয়ারির জন্য ব্যয় নির্ধারণের প্রক্রিয়া চলাকালীন এটি অনুসন্ধানের পরিকল্পনাটি মূল্যায়ন করে তবে অনুমান করে যে এটি আরও বেশি চেষ্টা করবে। (এক্সিকিউশন প্ল্যানে SELECT এর উপরে ঘোরাফেরা করার সময় "অনুমানযুক্ত সাবট্রি কস্ট" নোট করুন)। এটি অগত্যা হয় খারাপ ধারণাও নয় - আমার পরীক্ষার মেশিনে, দেখার পরিকল্পনাটি বাছাই / স্ক্যানের সিপিইউ 6X নেয়।

এসকিউএল সার্ভারের অনুসন্ধানের পরিকল্পনার দাম কেন বেশি হতে পারে সে বিষয়ে রব ফারলির উত্তরের দিকে নজর দিন।


9

আপনি যদি বাছাইয়ের সাথে জড়িত তার সাথে 100,000 লুকআপে প্রয়োজনীয় পাঠ্যের সংখ্যার তুলনা করতে চান, তাহলে কোয়েরি অপ্টিমাইজারের চিত্রগুলি কেন সিআইএক্স + বাছাই করা সেরা পছন্দ হবে সে সম্পর্কে আপনি দ্রুত ধারণা পেতে পারেন।

লুক এক্সিকিউশনটি দ্রুত হওয়া শেষ হয়েছে কারণ পঠিত পৃষ্ঠাগুলি মেমরির মধ্যে রয়েছে (আপনি ক্যাশে সাফ করলেও, আপনার প্রতি পৃষ্ঠায় প্রচুর সারি রয়েছে, তাই আপনি একই পৃষ্ঠাগুলি বার বার পড়ছেন তবে বিভিন্ন পরিমাণে টুকরো টুকরো বা অন্যান্য ক্রিয়াকলাপের থেকে ভিন্ন মেমরি চাপ, এটি নাও হতে পারে)। সিআইএক্স + সাজানোর কাজটি দ্রুত করার জন্য এটি এতটা সত্যই গ্রহণ করবে না, তবে আপনি যা দেখছেন তা হ'ল কারণ একটি পঠনের ব্যয় একই পাতাগুলি বারবার আঘাত করার তুলনামূলক সস্তাতা বিবেচনায় নেয় না।


4

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

জন আইজব্রেনারের মন্তব্য অনুসারে পরামর্শ হিসাবে , অন্যতম উল্লেখযোগ্য, এমনকি অন্যের ব্লগে, কিম্বারলি এল ট্রিপের এই আকর্ষণীয় নিবন্ধটি:

তবে এটি একমাত্র নয়, আপনি যদি আগ্রহী হন তবে আপনি এই পৃষ্ঠাগুলি একবার দেখে নিতে পারেন:

আপনি দেখতে পাচ্ছেন, এগুলি সবাই টিপিং পয়েন্টের ধারণার চারপাশে ঘুরে বেড়ায় ।

কেএল ট্রিপ নিবন্ধ থেকে উদ্ধৃত

টিপিং পয়েন্ট কী?

এটি সেই বিন্দু যেখানে ফিরে আসা সারির সংখ্যাটি " আর যথেষ্ট নির্বাচনী নয় "। এসকিউএল সার্ভার সম্পর্কিত তথ্য সারিগুলি অনুসন্ধান করার জন্য নন-ক্লাস্টারড সূচকটি ব্যবহার না করা এবং তার পরিবর্তে একটি টেবিল স্ক্যান সম্পাদন করে।

এসকিউএল সার্ভার যখন একটি হিপে একটি নন-ক্লাস্টারড ইনডেক্স ব্যবহার করে, মূলত এটি বেস টেবিলের পৃষ্ঠাগুলিতে পয়েন্টারগুলির একটি তালিকা পায়। তারপরে এটি রো আইডি লুকআপস (আরআইডি) নামক ক্রিয়াকলাপের সাহায্যে সারিগুলি পুনরুদ্ধার করতে এই পয়েন্টারগুলি ব্যবহার করে। এর অর্থ হ'ল কমপক্ষে, এটি যতগুলি পাতার পাঠানো সারিগুলির সংখ্যা হিসাবে পাঠ করবে এবং সম্ভবত আরও কিছু ব্যবহার করবে। প্রক্রিয়াটি কিছুটা একই ফলাফল সহ বেস টেবিলের মতো ক্লাস্টারযুক্ত সূচকের সাথে একই রকম: আরও পড়ুন।

কিন্তু, যখন এই টিপিং পয়েন্টটি ঘটে?

অবশ্যই এই জীবনের বেশিরভাগ জিনিস হিসাবে, এটি নির্ভর করে ...

কোনও সিরিয়াসলি নয়, এটি প্রতি পৃষ্ঠায় কত সারি নির্ভর করে সারণীতে পৃষ্ঠাগুলির সংখ্যার 25% থেকে 33% এর মধ্যে ঘটে। তবে আরও কিছু কারণ রয়েছে যা আপনার বিবেচনা করা উচিত:

আইটিপিআরটোডে নিবন্ধ থেকে উদ্ধৃত

টিপিং পয়েন্টকে প্রভাবিত করে এমন অন্যান্য বিষয়গুলি যদিও আরআইডি লুকআপগুলির ব্যয় টিপিং পয়েন্টকে প্রভাবিত করে এমন সবচেয়ে গুরুত্বপূর্ণ বিষয়, তবে আরও কয়েকটি কারণ রয়েছে:

  • একটি ক্লাস্টার্ড সূচক স্ক্যান করার সময় শারীরিক I / O অনেক বেশি দক্ষ। ক্লাস্টারড ইনডেক্স ডেটা ক্রম অনুসারে ডিস্কে সূচক ক্রমে স্থাপন করা হয়। ফলস্বরূপ, ডিস্কে খুব সামান্য পার্শ্বীয় মাথা ভ্রমণ আছে, যা I / O কার্যকারিতা উন্নত করে।
  • যখন ডাটাবেস ইঞ্জিন একটি ক্লাস্টার্ড সূচকটি স্ক্যান করছে, তখন এটি জানে যে ডিস্ক ট্র্যাকের পরবর্তী কয়েকটি পৃষ্ঠায় এখনও এটির প্রয়োজনীয় ডেটা থাকবে। সুতরাং, এটি সাধারণ 8KB পৃষ্ঠাগুলির পরিবর্তে 64KB অংশে পড়া শুরু করে। এর ফলে দ্রুত আই / ওও হয়।

এখন আমি যদি আমার কোয়েরিগুলি আবার পরিসংখ্যান আইও ব্যবহার করে চালিত করি:

SET STATISTICS IO ON;
SELECT id, foo, bar, nki FROM my_table WHERE nki < 20000 ORDER BY nki ;
SET STATISTICS IO OFF;

Logical reads: 312

SET STATISTICS IO ON;
SELECT id, foo, bar, nki FROM my_table WITH(INDEX(IX_my_TABLE));
SET STATISTICS IO OFF;

Logical reads: 41293

দ্বিতীয় ক্যোয়ারির প্রথমটির চেয়ে আরও লজিকাল রিডের প্রয়োজন।

আমার কি ক্লাস্টারযুক্ত সূচি এড়ানো উচিত?

না, একটি ক্লাস্টার্ড সূচকটি কার্যকর হতে পারে তবে আপনি এটি অর্জন করার জন্য যা চেষ্টা করছেন তা বিশ্লেষণ করে সময় নেওয়া এবং অতিরিক্ত চেষ্টা করা সমান।

কেএল ট্রিপ নিবন্ধ থেকে উদ্ধৃত

তাহলে এখন তোমার কি করা উচিত? এটা নির্ভর করে. আপনি যদি নিজের ডেটাটি ভাল জানেন এবং আপনি কোনও হিন্ট ব্যবহার করে বিবেচনা করতে পারেন এমন কিছু বিস্তৃত টেস্টিং করেন (এমন কিছু চতুর কাজ রয়েছে যা আপনি এসপিএসে প্রোগ্রামগতভাবে করতে পারেন, আমি চেষ্টা করব এবং শীঘ্রই এটিতে একটি পোস্ট উত্সর্গ করব)। যাইহোক, একটি আরও ভাল পছন্দ (যদি সম্ভব হয় তবে) আচ্ছাদন বিবেচনা করা (এটি সত্যই আমার মূল বিষয় :)। আমার অনুসন্ধানগুলিতে, আচ্ছাদনটি অবাস্তব কারণ আমার প্রশ্নগুলি সমস্ত কলামগুলি চায় (অশুভ নির্বাচন করুন *) তবে, যদি আপনার প্রশ্নগুলি সংকীর্ণ হয় এবং সেগুলি উচ্চ-অগ্রাধিকারের হয় তবে আপনি একটি ইঙ্গিতের চেয়ে একটি কভারিং সূচী (অনেক ক্ষেত্রে) ছাড়াই ভাল because এমন একটি সূচি যা কোনও ক্যোয়ারিকে কভার করে, টিপসটি কখনও নয়।

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

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