SQL सर्वर सिंटैक्स एक प्राथमिक कुंजी भी एक क्लस्टर इंडेक्स बनाने के लिए है:
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
इसलिए तालिका में अद्वितीय होने के लिए क्लस्टरिंग कुंजी ( ) की आवश्यकता नहीं है। एक "विशिष्ट" स्वचालित रूप से SQL सर्वर द्वारा बनाया जाएगा और 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;
मेरे tempdb से परिणाम हैं:
ऊपर की छवि में, पहले तीन कॉलम fn_PhysLocCracker
फ़ंक्शन से आउटपुट हैं , डिस्क पर पंक्तियों के भौतिक क्रम को दिखाते हुए। आप slot_id
मान के साथ लॉक-स्टेप बढ़ाता हुआ मान देख सकते हैं c2
, जो क्लस्टरिंग कुंजी है। प्राथमिक कुंजी इंडेक्स एक अलग क्रम में पंक्तियों को संग्रहीत करता है, जिसे SQL सर्वर को प्राथमिक कुंजी को स्कैन करने से परिणाम वापस करने के लिए मजबूर करके देखा जा सकता है:
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)