ক্লাস্টারড এবং নন ক্লাস্টারড ইনডেক্সের মধ্যে পারফরম্যান্স পার্থক্য


22

আমি পড়ছিলাম Clusteredএবং Non Clustered Indexes

Clustered Index- এটিতে ডেটা পৃষ্ঠা রয়েছে। তার মানে সম্পূর্ণ সারির তথ্য ক্লাস্টারড ইনডেক্স কলামে উপস্থিত থাকবে।

Non Clustered Index- এটিতে কেবল ক্লাস্টারড ইনডেক্স কলাম আকারে সারি লোকারকের তথ্য রয়েছে (যদি অবৈব হয়) বা ফাইলের পরিচয়দাতা + পৃষ্ঠা নম্বর + একটি পৃষ্ঠায় মোট সারি। এর অর্থ হ'ল আসল ডেটা সনাক্ত করতে ক্যোয়ারী ইঞ্জিনকে অবশ্যই একটি অতিরিক্ত পদক্ষেপ নিতে হবে।

ক্যোয়ারী - আমি কিভাবে ব্যবহারিক উদাহরণ একটি সাহায্যে কর্মক্ষমতা পার্থক্য পরীক্ষা করতে পারবেন যেমন আমরা জানি টেবিল শুধুমাত্র এক আছে করতে Clustered Indexএবং উপলব্ধ sortingClustered Index Columnএবং Non Clustered Indexপ্রদান করবেন না sortingএবং 999 সমর্থন করতে পারে Non Clustered Indexesমধ্যে SQL Server 2008এবং 249 SQL Server 2005


2
পারফরম্যান্স পার্থক্য যখন আপনি কি করেন ?, সেই টেবিলটি নিয়ে আপনি কী ধরণের কাজ করতে চান ?, কোনও প্রয়োজন নেই যা প্রতিটি প্রয়োজনের
অনুকূলে রয়েছে

2
এখানে সম্ভবত কিছু স্থির আলোচনা। stackoverflow.com/questions/91688/… stackoverflow.com/questions/5070529/… স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 1251636/… আমরা ক্লাস্টারড এবং নন-ক্লাস্টার ইনডেক্সের মধ্যে পার্থক্য সম্পর্কে একটি গবেষণামূলক রচনা লিখতে পারি, তবে আমি মনে করি না আমরা এমন কিছু বলবে যা ইতিমধ্যে আপনার কাছে পড়ার জন্য উপলব্ধ নেই।
অ্যারন বার্ট্র্যান্ড

4
আপনি লিখেছেন: "এর অর্থ হ'ল আসল ডেটা সনাক্ত করতে ক্যোয়ারী ইঞ্জিনকে অবশ্যই একটি অতিরিক্ত পদক্ষেপ নিতে হবে।" আসলে, আপনি প্রয়োজন সব যদি কলাম হয় সূচক মধ্যে আবৃত , আপনি না কোনো অতিরিক্ত পদক্ষেপ নিতে nonclustered সূচক আপনার টার্গেট সারি এটি পরে প্রয়োজন। কেবল যখন আপনার অবিচ্ছিন্ন সূচক দ্বারা আচ্ছাদিত কলামগুলির প্রয়োজন নেই কেবল তখন এসকিউএল সার্ভারকে বুকমার্ক অনুসন্ধান করতে হবে ।
নিক চামাস

উত্তর:


43

এটি যেমন একটি গুরুত্বপূর্ণ ধারণা হিসাবে খুব ভাল প্রশ্ন। যদিও এটি একটি বড় বিষয় এবং আমি আপনাকে যা দেখাতে যাচ্ছি এটি একটি সরলীকরণ যা আপনি বেস ধারণাগুলি বুঝতে পারবেন।

প্রথমত যখন আপনি ক্লাস্টারড সূচকটি দেখতে পান সারণী । এসকিউএল সার্ভারে যদি কোনও টেবিলটিতে একটি ক্লাস্টারড ইনডেক্স থাকে না তবে এটি হিপ। টেবিলটিতে একটি ক্লাস্টারড ইনডেক্স তৈরি করা টেবিলটিকে আসলে বি-ট্রি টাইপের কাঠামোতে রূপান্তরিত করে। আপনার ক্লাস্টারড ইনডেক্সটি আপনার টেবিলটি টেবিলের থেকে পৃথক নয়

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

আমি একটি সাধারণ উদাহরণ ব্যবহার করে এটি চেষ্টা এবং ব্যাখ্যা করতে যাচ্ছি।

দ্রষ্টব্য: আমি এই উদাহরণে টেবিলটি তৈরি করেছি এবং এটি 3 মিলিয়নেরও বেশি এলোমেলো এন্ট্রি দিয়ে পূরণ করেছি। তারপরে আসল প্রশ্নগুলি চালিয়ে এখানে কার্যকর করার পরিকল্পনাগুলি আটকে দিয়েছে।

আপনি কি সত্যিই উপলব্ধি করতে প্রয়োজন হে স্বরলিপি বা কর্মক্ষম দক্ষতা । ধরে নেওয়া যাক আপনার নীচের সারণী রয়েছে have

CREATE TABLE [dbo].[Customer](
[CustomerID] [int] IDENTITY(1,1) NOT NULL,
[CustomerName] [varchar](100) NOT NULL,
[CustomerSurname] [varchar](100) NOT NULL,
CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
(
[CustomerID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF
  , IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS  = ON
  , ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

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

আমরা গ্রাহকনাম ক্ষেত্রে একটি ক্লাস্টারবিহীন সূচকও তৈরি করব। নিম্নলিখিত কোডটি এটি করবে।

CREATE NONCLUSTERED INDEX [ix_Customer_CustomerName] ON [dbo].[Customer] 
 (
[CustomerName] ASC
 )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF
  , SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF
  , DROP_EXISTING = OFF, ONLINE = OFF
  , ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

সুতরাং এই সূচীতে আপনি ডাটা পৃষ্ঠাগুলি / পাতার স্তরের নোডগুলিতে ক্লাস্টারড ইনডেক্সের মধ্যবর্তী স্তরের একটি পয়েন্টার খুঁজে পাবেন find গ্রাহকনাম ক্ষেত্রের চারপাশে সূচকটি সাজানো / অর্ডার করা হয়েছে। সুতরাং মধ্যবর্তী স্তরে গ্রাহকনাম মান রয়েছে এবং পাতার স্তরের পয়েন্টারটি থাকবে (এই পয়েন্টার মানগুলি প্রাথমিকভাবে মূল মান বা গ্রাহকআইডি কলাম)।

ঠিক আছে যদি আমরা নিম্নলিখিত কোয়েরি কার্যকর করি:

SELECT * FROM Customer WHERE CustomerID = 1 

এসকিউএল সম্ভবত একটি সিক অপারেশনের মাধ্যমে ক্লাস্টার্ড সূচকটি পড়বে। সিক অপারেশন হ'ল একটি বাইনারি অনুসন্ধান যা একটি স্ক্যানের চেয়ে অনেক বেশি দক্ষ যা অনুক্রমিক অনুসন্ধান। সুতরাং আমাদের উপরের উদাহরণে সূচকটি পঠিত এবং বাইনারি অনুসন্ধান এসকিউএল ব্যবহার করে এমন ডেটা নির্মূল করতে পারে যা আমরা খুঁজছি যা মানদণ্ডের সাথে মেলে না। ক্যোয়ারী পরিকল্পনার জন্য সংযুক্ত স্ক্রিন শট দেখুন।

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

সুতরাং সিক অপারেশনের জন্য অপারেশনগুলির সংখ্যা বা হে নোটেশন নিম্নরূপ:

  1. মধ্যবর্তী স্তরের মানগুলির সাথে সন্ধান করা মানের তুলনা করে ক্লাস্টার ইনডেক্সে বাইনারি অনুসন্ধান করুন।
  2. মেলে এমন মানগুলি ফিরিয়ে দিন (যেহেতু ক্লাস্টারড ইনডেক্সের সমস্ত ডেটা রয়েছে তাই মনে রাখবেন যে এটি সারি ডেটা হওয়ায় সূচি থেকে সমস্ত কলাম ফিরে আসতে পারে)

সুতরাং এটি দুটি অপারেশন। তবে আমরা যদি নিম্নলিখিত জিজ্ঞাসাটি কার্যকর করি:

SELECT * FROM Customer WHERE CustomerName ='John'

এসকিউএল এখন অনুসন্ধান করতে গ্রাহকনামে নন-ক্লাস্টারযুক্ত সূচক ব্যবহার করবে। তবে এটি যেহেতু এটি একটি ক্লাস্টারযুক্ত সূচক নয় এটিতে সারির সমস্ত ডেটা থাকে না।

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

যেহেতু আমাদের অ-ক্লাস্টারযুক্ত সূচীতে কেবলমাত্র কাস্টমারনাম ফিল্ড (অন্তর্বর্তী নোডগুলিতে সঞ্চিত ক্ষেত্রের মানগুলি) এবং গ্রাহকআইডিএর ডেটারের পয়েন্টার রয়েছে তাই সূচকের গ্রাহকসংখ্যার কোনও রেকর্ড নেই। ক্লাস্টার ইনডেক্স বা টেবিল থেকে কাস্টমারসনাম আনতে হবে।

এই কোয়েরিটি চালানোর সময় আমি নিম্নলিখিত সম্পাদন পরিকল্পনাটি পাই:

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

উপরের স্ক্রিন শটটিতে আপনার জন্য দুটি গুরুত্বপূর্ণ বিষয় লক্ষ্য করা যায়

  1. এসকিউএল বলছে যে আমার একটি অনুপস্থিত সূচক রয়েছে (সবুজ রঙের পাঠ্য)। এসকিউএল পরামর্শ দিচ্ছে যে আমি গ্রাহকনামে একটি সূচক তৈরি করব যাতে গ্রাহকআইডি এবং গ্রাহকসৌনতম অন্তর্ভুক্ত রয়েছে।
  2. আপনি দেখতে পাবেন যে ক্যোয়ারির 99% সময় প্রাথমিক কী সূচি / ক্লাস্টারড ইনডেক্সে একটি মূল অনুসন্ধানে ব্যয় করা হয়েছে।

এসকিউএল কেন আবার গ্রাহকনামে সূচকের পরামর্শ দিচ্ছে? ঠিক আছে যেহেতু সূচীতে কেবলমাত্র গ্রাহকআইডি এবং গ্রাহকনাম এসকিউএল এখনও সারণী / ক্লাস্টারযুক্ত সূচী থেকে গ্রাহক নামটি সন্ধান করতে হবে।

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

এখানে আপনি ক্লাস্টার্ড কী থেকে গ্রাহকসত্ত্ব নাম কলামটি পেতে অতিরিক্ত ক্রিয়াকলাপ এসকিউএলকে দেখতে পাচ্ছেন

সুতরাং অপারেশন সংখ্যা নিম্নরূপ:

  1. মধ্যবর্তী স্তরের মানগুলির সাথে অনুসন্ধান করা মানের তুলনা করে নন-ক্লাস্টারযুক্ত সূচকে বাইনারি অনুসন্ধান করুন
  2. নোডগুলির সাথে মেলে যা লিফ লেভেল নোড পড়েন যা ক্লাস্টারড ইনডেক্সের ডেটার জন্য পয়েন্টার ধারণ করবে (পাতার স্তরের নোডগুলি উপায় দ্বারা প্রাথমিক কী মানগুলি অন্তর্ভুক্ত করবে)।
  3. প্রতিটি মান প্রত্যাবর্তনের জন্য ক্লাস্টারড ইনডেক্স (টেবিল) এ সারি মানগুলি খুঁজে পেতে এখানে পড়ুন আমরা কাস্টমারসনেম পড়ব।
  4. সারি সারি সারণী ফিরে আসুন

মানটি বের করার জন্য এটি 4 টি অপারেশন। ক্লাস্টারড ইনডেক্স পড়ার তুলনায় অপারেশনগুলির পরিমাণ দ্বিগুণ। আপনাকে দেখায় যে আপনার ক্লাস্টারড ইনডেক্সটি আপনার সবচেয়ে শক্তিশালী সূচক কারণ এতে সমস্ত ডেটা রয়েছে contains

সুতরাং কেবল একটি শেষ পয়েন্ট পরিষ্কার করা। আমি কেন বলব যে নন-ক্লাস্টারড ইনডেক্সের পয়েন্টারটি মূল কী মান? ভাল করে দেখাতে হবে যে নন-ক্লাস্টারড ইনডেক্সের পাতার স্তর নোডগুলিতে আমি আমার ক্যোয়ারীটিতে প্রাথমিক কী মানটি পরিবর্তন করি:

SELECT CustomerID
FROM Customer
WHERE CustomerName='Jane'

এই ক্যোয়ারিতে এসকিউএল নন-ক্লাস্টারড ইনডেক্স থেকে গ্রাহকআইডি পড়তে পারে। এটি ক্লাস্টারড ইনডেক্সে দেখার প্রয়োজন নেই। এটি আপনি কার্যকর করার পরিকল্পনা দ্বারা দেখতে পাবেন যা দেখতে এটির মতো দেখাচ্ছে।

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

এই কোয়েরি এবং পূর্ববর্তী ক্যোয়ারির মধ্যে পার্থক্যটি লক্ষ্য করুন। কোনও খোঁজ নেই। এসকিউএল অ ক্লাস্টারযুক্ত সূচীতে সমস্ত ডেটা খুঁজে পেতে পারে can

আশা করি আপনি বুঝতে শুরু করতে পারবেন যে ক্লাস্টারড ইনডেক্সটি হ'ল টেবিল এবং নন-ক্লাস্টারযুক্ত সূচীগুলিতে সমস্ত ডেটা থাকে না। বাইনারি অনুসন্ধানগুলি করা যেতে পারে তবে কেবল ক্লাস্টারযুক্ত সূচিগুলিতে সমস্ত ডেটা থাকে এই কারণে ইনডেক্সিং নির্বাচনের গতি বাড়ায়। সুতরাং একটি ক্লাস্টারবিহীন সূচীতে অনুসন্ধানের ফলে প্রায়শই ক্লাস্টারড সূচক থেকে মানগুলি লোড হয়ে যায়। এই অতিরিক্ত ক্রিয়াকলাপগুলি ক্লাস্টারযুক্ত সূচকের চেয়ে ক্লাস্টারযুক্ত সূচকে কম দক্ষ করে তোলে।

আশা করি এটি পরিষ্কার হয়ে যাবে। যদি কিছু বোঝা না যায় তবে একটি মন্তব্য পোস্ট করুন এবং আমি পরিষ্কার করার চেষ্টা করব। এখানে বরং অনেকটা দেরি হয়ে গেছে এবং আমার মস্তিষ্কের একটি বিট ফ্ল্যাট অনুভূত হচ্ছে। একটি লাল ষাঁড় জন্য সময়।


আমার একটা প্রশ্ন আছে. এই অনুসন্ধানের জন্য গ্রাহকনামে নন-ক্লাস্টারযুক্ত সূচীতে কোন সূচক অনুসন্ধান করছে কেন গ্রাহক নাম যেখানে 'গ্রাহক নাম' থেকে 'জন' নির্বাচন করুন। যেহেতু এটি একটি ক্লাস্টারযুক্ত সূচক নয় তাই গ্রাহকের নাম বাছাই করা হবে না। সুতরাং একটি সূচি স্ক্যান করা উচিত নয়।
ckv

বিটিডাব্লু গ্রেট উত্তর উপরোক্ত প্রশ্ন ব্যতীত সম্পূর্ণ বোঝা।
ckv

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

9

"এর অর্থ হ'ল আসল ডেটা সনাক্ত করতে ক্যোয়ারী ইঞ্জিনকে অবশ্যই একটি অতিরিক্ত পদক্ষেপ নিতে হবে।"

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

সুতরাং চূড়ান্ত উত্তরটি হ'ল - এটি নির্ভর করে (আপনি একটি একক প্রশ্নে সত্যিকারের চেয়ে অনেক বেশি তথ্যের উপর নির্ভর করতে পারেন) - আপনাকে সূচীর সমস্ত ক্ষমতা বুঝতে হবে এবং প্রদত্ত কোনও প্রশ্নের জন্য কার্যকরকরণ পরিকল্পনাটি আপনার প্রত্যাশা থেকে আলাদা হতে পারে।

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

এবং অনুমোদিত বিভিন্ন সূচকের সীমা সম্পর্কে আমি উদ্বিগ্ন হব না - এটি প্রায় নিশ্চিতভাবেই অনেক বাস্তব-বিশ্বের উদাহরণে কার্যকর হবে না।


2
+1 এর জন্য there are always exceptions- অনেক লোক এটিকে বাদ দেয় এবং ভাবেন যে প্রতিটি ক্লাস্টারড সূচী int identityকোনও বিষয় নয়।
জেএনকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.