এটি যেমন একটি গুরুত্বপূর্ণ ধারণা হিসাবে খুব ভাল প্রশ্ন। যদিও এটি একটি বড় বিষয় এবং আমি আপনাকে যা দেখাতে যাচ্ছি এটি একটি সরলীকরণ যা আপনি বেস ধারণাগুলি বুঝতে পারবেন।
প্রথমত যখন আপনি ক্লাস্টারড সূচকটি দেখতে পান সারণী । এসকিউএল সার্ভারে যদি কোনও টেবিলটিতে একটি ক্লাস্টারড ইনডেক্স থাকে না তবে এটি হিপ। টেবিলটিতে একটি ক্লাস্টারড ইনডেক্স তৈরি করা টেবিলটিকে আসলে বি-ট্রি টাইপের কাঠামোতে রূপান্তরিত করে। আপনার ক্লাস্টারড ইনডেক্সটি আপনার টেবিলটি টেবিলের থেকে পৃথক নয়
কখনও ভেবে দেখেছেন কেন আপনি কেবল একটি ক্লাস্টার ইনডেক্স রাখতে পারবেন? ঠিক আছে যদি আমাদের দুটি ক্লাস্টার ইনডেক্স থাকে তবে আমাদের টেবিলের দুটি কপি লাগবে। এটি সব পরে তথ্য রয়েছে।
আমি একটি সাধারণ উদাহরণ ব্যবহার করে এটি চেষ্টা এবং ব্যাখ্যা করতে যাচ্ছি।
দ্রষ্টব্য: আমি এই উদাহরণে টেবিলটি তৈরি করেছি এবং এটি 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
এসকিউএল সম্ভবত একটি সিক অপারেশনের মাধ্যমে ক্লাস্টার্ড সূচকটি পড়বে। সিক অপারেশন হ'ল একটি বাইনারি অনুসন্ধান যা একটি স্ক্যানের চেয়ে অনেক বেশি দক্ষ যা অনুক্রমিক অনুসন্ধান। সুতরাং আমাদের উপরের উদাহরণে সূচকটি পঠিত এবং বাইনারি অনুসন্ধান এসকিউএল ব্যবহার করে এমন ডেটা নির্মূল করতে পারে যা আমরা খুঁজছি যা মানদণ্ডের সাথে মেলে না। ক্যোয়ারী পরিকল্পনার জন্য সংযুক্ত স্ক্রিন শট দেখুন।
সুতরাং সিক অপারেশনের জন্য অপারেশনগুলির সংখ্যা বা হে নোটেশন নিম্নরূপ:
- মধ্যবর্তী স্তরের মানগুলির সাথে সন্ধান করা মানের তুলনা করে ক্লাস্টার ইনডেক্সে বাইনারি অনুসন্ধান করুন।
- মেলে এমন মানগুলি ফিরিয়ে দিন (যেহেতু ক্লাস্টারড ইনডেক্সের সমস্ত ডেটা রয়েছে তাই মনে রাখবেন যে এটি সারি ডেটা হওয়ায় সূচি থেকে সমস্ত কলাম ফিরে আসতে পারে)
সুতরাং এটি দুটি অপারেশন। তবে আমরা যদি নিম্নলিখিত জিজ্ঞাসাটি কার্যকর করি:
SELECT * FROM Customer WHERE CustomerName ='John'
এসকিউএল এখন অনুসন্ধান করতে গ্রাহকনামে নন-ক্লাস্টারযুক্ত সূচক ব্যবহার করবে। তবে এটি যেহেতু এটি একটি ক্লাস্টারযুক্ত সূচক নয় এটিতে সারির সমস্ত ডেটা থাকে না।
সুতরাং এসকিউএল মধ্যবর্তী স্তরগুলিতে অনুসন্ধান করবে যা রেকর্ডগুলি মেলে তারপরে প্রকৃত তথ্য পুনরুদ্ধার করতে ক্লাস্টারড ইনডেক্সে (আর্ট টেবিল) ক্লাস্টারড ইনডেক্সে অন্য অনুসন্ধান করার জন্য ফিরে আসা মানগুলি ব্যবহার করে একটি অনুসন্ধান করবে। এগুলি বিভ্রান্তিকর শোনায় আমি জানি তবে পড়েছি এবং সমস্ত পরিষ্কার হয়ে যাবে।
যেহেতু আমাদের অ-ক্লাস্টারযুক্ত সূচীতে কেবলমাত্র কাস্টমারনাম ফিল্ড (অন্তর্বর্তী নোডগুলিতে সঞ্চিত ক্ষেত্রের মানগুলি) এবং গ্রাহকআইডিএর ডেটারের পয়েন্টার রয়েছে তাই সূচকের গ্রাহকসংখ্যার কোনও রেকর্ড নেই। ক্লাস্টার ইনডেক্স বা টেবিল থেকে কাস্টমারসনাম আনতে হবে।
এই কোয়েরিটি চালানোর সময় আমি নিম্নলিখিত সম্পাদন পরিকল্পনাটি পাই:
উপরের স্ক্রিন শটটিতে আপনার জন্য দুটি গুরুত্বপূর্ণ বিষয় লক্ষ্য করা যায়
- এসকিউএল বলছে যে আমার একটি অনুপস্থিত সূচক রয়েছে (সবুজ রঙের পাঠ্য)। এসকিউএল পরামর্শ দিচ্ছে যে আমি গ্রাহকনামে একটি সূচক তৈরি করব যাতে গ্রাহকআইডি এবং গ্রাহকসৌনতম অন্তর্ভুক্ত রয়েছে।
- আপনি দেখতে পাবেন যে ক্যোয়ারির 99% সময় প্রাথমিক কী সূচি / ক্লাস্টারড ইনডেক্সে একটি মূল অনুসন্ধানে ব্যয় করা হয়েছে।
এসকিউএল কেন আবার গ্রাহকনামে সূচকের পরামর্শ দিচ্ছে? ঠিক আছে যেহেতু সূচীতে কেবলমাত্র গ্রাহকআইডি এবং গ্রাহকনাম এসকিউএল এখনও সারণী / ক্লাস্টারযুক্ত সূচী থেকে গ্রাহক নামটি সন্ধান করতে হবে।
যদি আমরা সূচকটি তৈরি করে থাকি এবং আমরা এসএসকিউএলে কাস্টমারসনাম কলামটি অন্তর্ভুক্ত করি তবে কেবল ক্লাস্টারবিহীন সূচকটি পড়ে পুরো ক্যোয়ারীটি পূরণ করতে সক্ষম হব। এজন্য এসকিউএল পরামর্শ দিচ্ছে যে আমি আমার নন-ক্লাস্টারড ইনডেক্সটি পরিবর্তন করব।
এখানে আপনি ক্লাস্টার্ড কী থেকে গ্রাহকসত্ত্ব নাম কলামটি পেতে অতিরিক্ত ক্রিয়াকলাপ এসকিউএলকে দেখতে পাচ্ছেন
সুতরাং অপারেশন সংখ্যা নিম্নরূপ:
- মধ্যবর্তী স্তরের মানগুলির সাথে অনুসন্ধান করা মানের তুলনা করে নন-ক্লাস্টারযুক্ত সূচকে বাইনারি অনুসন্ধান করুন
- নোডগুলির সাথে মেলে যা লিফ লেভেল নোড পড়েন যা ক্লাস্টারড ইনডেক্সের ডেটার জন্য পয়েন্টার ধারণ করবে (পাতার স্তরের নোডগুলি উপায় দ্বারা প্রাথমিক কী মানগুলি অন্তর্ভুক্ত করবে)।
- প্রতিটি মান প্রত্যাবর্তনের জন্য ক্লাস্টারড ইনডেক্স (টেবিল) এ সারি মানগুলি খুঁজে পেতে এখানে পড়ুন আমরা কাস্টমারসনেম পড়ব।
- সারি সারি সারণী ফিরে আসুন
মানটি বের করার জন্য এটি 4 টি অপারেশন। ক্লাস্টারড ইনডেক্স পড়ার তুলনায় অপারেশনগুলির পরিমাণ দ্বিগুণ। আপনাকে দেখায় যে আপনার ক্লাস্টারড ইনডেক্সটি আপনার সবচেয়ে শক্তিশালী সূচক কারণ এতে সমস্ত ডেটা রয়েছে contains
সুতরাং কেবল একটি শেষ পয়েন্ট পরিষ্কার করা। আমি কেন বলব যে নন-ক্লাস্টারড ইনডেক্সের পয়েন্টারটি মূল কী মান? ভাল করে দেখাতে হবে যে নন-ক্লাস্টারড ইনডেক্সের পাতার স্তর নোডগুলিতে আমি আমার ক্যোয়ারীটিতে প্রাথমিক কী মানটি পরিবর্তন করি:
SELECT CustomerID
FROM Customer
WHERE CustomerName='Jane'
এই ক্যোয়ারিতে এসকিউএল নন-ক্লাস্টারড ইনডেক্স থেকে গ্রাহকআইডি পড়তে পারে। এটি ক্লাস্টারড ইনডেক্সে দেখার প্রয়োজন নেই। এটি আপনি কার্যকর করার পরিকল্পনা দ্বারা দেখতে পাবেন যা দেখতে এটির মতো দেখাচ্ছে।
এই কোয়েরি এবং পূর্ববর্তী ক্যোয়ারির মধ্যে পার্থক্যটি লক্ষ্য করুন। কোনও খোঁজ নেই। এসকিউএল অ ক্লাস্টারযুক্ত সূচীতে সমস্ত ডেটা খুঁজে পেতে পারে can
আশা করি আপনি বুঝতে শুরু করতে পারবেন যে ক্লাস্টারড ইনডেক্সটি হ'ল টেবিল এবং নন-ক্লাস্টারযুক্ত সূচীগুলিতে সমস্ত ডেটা থাকে না। বাইনারি অনুসন্ধানগুলি করা যেতে পারে তবে কেবল ক্লাস্টারযুক্ত সূচিগুলিতে সমস্ত ডেটা থাকে এই কারণে ইনডেক্সিং নির্বাচনের গতি বাড়ায়। সুতরাং একটি ক্লাস্টারবিহীন সূচীতে অনুসন্ধানের ফলে প্রায়শই ক্লাস্টারড সূচক থেকে মানগুলি লোড হয়ে যায়। এই অতিরিক্ত ক্রিয়াকলাপগুলি ক্লাস্টারযুক্ত সূচকের চেয়ে ক্লাস্টারযুক্ত সূচকে কম দক্ষ করে তোলে।
আশা করি এটি পরিষ্কার হয়ে যাবে। যদি কিছু বোঝা না যায় তবে একটি মন্তব্য পোস্ট করুন এবং আমি পরিষ্কার করার চেষ্টা করব। এখানে বরং অনেকটা দেরি হয়ে গেছে এবং আমার মস্তিষ্কের একটি বিট ফ্ল্যাট অনুভূত হচ্ছে। একটি লাল ষাঁড় জন্য সময়।