একটি ক্লাস্টারড ইনডেক্স তৈরির জন্য এসকিউএল সার্ভার সিনট্যাক্স যা এটিও একটি প্রাথমিক কী:
CREATE TABLE dbo.c
(
c1 INT NOT NULL,
c2 INT NOT NULL,
CONSTRAINT PK_c
PRIMARY KEY CLUSTERED (c1, c2)
);
আপনার মন্তব্য যতদূর: "একটি পিকে নামযুক্ত সূচক ব্যবহার করা", উপরের কোডটির ফলে প্রাথমিক কী সূচকটির নাম "পিকে_সি" হবে।
প্রাথমিক কী এবং ক্লাস্টারিং কী একই কলামে থাকতে হবে না। আপনি তাদের আলাদাভাবে সংজ্ঞায়িত করতে পারেন। উপরের উদাহরণে, CLUSTERED
কীওয়ার্ডটি এতে পরিবর্তন করুন NONCLUSTERED
এবং তারপরে CREATE INDEX
সিনট্যাক্সটি ব্যবহার করে কেবল একটি ক্লাস্টারড ইনডেক্স যুক্ত করুন :
CREATE TABLE dbo.c
(
c1 INT,
c2 INT,
CONSTRAINT PK_c
PRIMARY KEY NONCLUSTERED (c1, c2)
);
CREATE CLUSTERED INDEX CX_c ON dbo.c (c2);
এসকিউএল সার্ভারে ক্লাস্টার্ড ইনডেক্সটি হ'ল টেবিল, এগুলি এক এবং একই। একটি ক্লাস্টার্ড সূচকটি সারণীতে সঞ্চিত সারিগুলির যৌক্তিক ক্রম সংজ্ঞায়িত করে। আমার প্রথম উদাহরণে, সারিগুলি c1
এবং c2
কলামগুলির মান অনুসারে সংরক্ষণ করা হয় । যেহেতু ক্লাস্টারিং কী এছাড়াও প্রাথমিক কী, সমন্বয় হিসাবে সংজ্ঞায়িত করা হয় c1
এবং c2
টেবিল ব্যাপী অনন্য হওয়া আবশ্যক।
দ্বিতীয় উদাহরণে, প্রাথমিক কীটি c1
এবং c2
কলামগুলির সমন্বয়ে গঠিত , তবে ক্লাস্টারিং কীটি কেবল c2
কলাম। যেহেতু আমি বিবৃতিতে UNIQUE
বৈশিষ্ট্যটি নির্দিষ্ট করেছি না CREATE INDEX
, তাই ক্লাস্টারিং কী ( c2
) টেবিল জুড়ে অনন্য হতে হবে না। একটি "ইউনিকফিফায়ার" স্বয়ংক্রিয়ভাবে এসকিউএল সার্ভার দ্বারা c2
তৈরি হবে এবং ক্লাস্টারিং কী তৈরি করতে কলামের মানগুলিতে সংযুক্ত হবে । এই ক্লাস্টারিং কীটি যেহেতু এটি এখন অনন্য, তাই টেবিলে তৈরি অন্যান্য সূচীতে সারি আইডি হিসাবে ব্যবহৃত হবে।
ক্লাস্টারিং কীটি স্টোরেজে সারিগুলির বিন্যাস নিয়ন্ত্রণ করে তা প্রমাণ করার জন্য, আপনি অনাবন্ধিত ফাংশনটি ব্যবহার করতে পারেন fn_PhysLocCracker(%%PHYSLOC%%)
,। নিম্নলিখিত কোডটি দেখায় যে সারিগুলি c2
কলামের ক্রম অনুসারে ডিস্কে বিছিয়ে দেওয়া হয়েছে , যা আমি ক্লাস্টারিং কী হিসাবে সংজ্ঞায়িত করেছি:
USE tempdb;
CREATE TABLE dbo.PKTest
(
c1 INT NOT NULL
, c2 INT NOT NULL
, c3 VARCHAR(256) NOT NULL
);
ALTER TABLE PKTest
ADD CONSTRAINT PK_PKTest
PRIMARY KEY NONCLUSTERED (c1, c2);
CREATE CLUSTERED INDEX CX_PKTest
ON dbo.PKTest(c2);
TRUNCATE TABLE dbo.PKTest;
INSERT INTO dbo.PKTest (c1, c2, c3)
SELECT TOP(25) o1.object_id / o2.object_id, o2.object_id, o1.name + '.' + o2.name
FROM sys.objects o1
, sys.objects o2
WHERE o1.object_id >0
and o2.object_id > 0;
SELECT plc.file_id
, plc.page_id
, plc.slot_id
, pk.*
FROM dbo.PKTest pk
CROSS APPLY fn_PhysLocCracker(%%PHYSLOC%%) plc;
আমার টেম্পডিবি থেকে প্রাপ্ত ফলাফলগুলি হ'ল:
উপরের চিত্রটিতে, প্রথম তিনটি কলামটি fn_PhysLocCracker
ডিস্কে সারিগুলির দৈহিক ক্রম দেখিয়ে ফাংশন থেকে আউটপুট হয় । আপনি slot_id
মানটির সাথে মান বৃদ্ধি করে লক-স্টেপ দেখতে পাচ্ছেন c2
যা ক্লাস্টারিং কী। প্রাথমিক কী সূচকটি সারিগুলি একটি পৃথক ক্রমে সংরক্ষণ করে, যা এসকিউএল সার্ভারকে প্রাথমিক কী স্ক্যান করে ফলাফল ফেরত দিতে বাধ্য করে দেখা যায়:
SELECT pkt.c1
, pkt.c2
FROM dbo.PKTest pkt WITH (INDEX = PK_PKTest, FORCESCAN);
দ্রষ্টব্য, ORDER BY
যেহেতু আমি প্রাথমিক কী সূচকগুলিতে আইটেমগুলির ক্রম দেখানোর চেষ্টা করছি তাই আমি উপরের বিবৃতিতে একটি ধারা ব্যবহার করি নি ।
উপরের ক্যোয়ারী থেকে আউটপুটটি হ'ল:
fn_PhysLocCracker
ফাংশনটির দিকে চেয়ে আমরা প্রাথমিক কী সূচকের শারীরিক ক্রম দেখতে পারি।
SELECT plc.file_id
, plc.page_id
, plc.slot_id
, pkt.c1
, pkt.c2
FROM dbo.PKTest pkt WITH (INDEX = PK_PKTest, FORCESCAN)
CROSS APPLY fn_PhysLocCracker(%%PHYSLOC%%) plc;
যেহেতু আমরা কেবলমাত্র সূচক থেকে নিজেই পড়ছি, অর্থাত্ সূচকের বাইরে কোনও কলামই কোয়েরিতে উল্লেখ করা হচ্ছে না, %%PHYSLOC%%
মানগুলি সূচীতেই পৃষ্ঠাগুলি উপস্থাপন করে।
ফলাফলগুলো:
create table c (c1 int not null primary key, c2 int)