SQL सर्वर Oracle Oracle INDEX क्लॉज के बराबर है


9

ओरेकल में USING INDEX क्लॉज के बराबर SQL Server 2008 है? विशेष रूप से निर्माण के लिए:

CREATE TABLE c(c1 INT, c2 INT);
CREATE INDEX ci ON c (c1, c2);
ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci;

यूनिक इंडेक्स पर एसक्यूएल सर्वर डॉक्यूमेंटेशन में यह कहा गया है (जोर दिया गया):

यूनिक इंडेक्स को निम्नलिखित तरीकों से लागू किया जाता है:

प्राथमिक कुंजी या अद्वितीय बाधा

जब आप एक प्राथमिक कुंजी बाधा बनाते हैं, तो स्तंभ या स्तंभों पर एक अद्वितीय क्लस्टर इंडेक्स स्वचालित रूप से बनाया जाता है यदि टेबल पर एक क्लस्टर इंडेक्स पहले से मौजूद नहीं है और आप एक अद्वितीय नॉनस्ट्रेस्ड इंडेक्स निर्दिष्ट नहीं करते हैं । प्राथमिक कुंजी स्तंभ NULL मानों की अनुमति नहीं दे सकता है।

जिसका अर्थ यह प्रतीत होता है कि प्राथमिक कुंजी के लिए किस सूचकांक का उपयोग किया जाना चाहिए, यह निर्दिष्ट करने का एक तरीका है।


बस तालिका के साथ मिलकर पीके को परिभाषित करें। create table c (c1 int not null primary key, c2 int)
a_horse_with_no_name

यह "एक पीके नामांकित इंडेक्स का उपयोग कर रहा है" वह हिस्सा है जिसमें मुझे दिलचस्पी है।
nik

नहीं, ऐसा करने का कोई तरीका नहीं है। एक प्राथमिक कुंजी एक बाधा और एक सूचकांक है। आपने जो प्राथमिक कुंजी प्रदान की है वह डिफ़ॉल्ट रूप से एक अद्वितीय क्लस्टर इंडेक्स होगी। जो दूसरे परिभाषित सूचकांक को तब तक डुप्लिकेट बना देगा जब तक कि आप उस खंड में c1 और c2 दोनों को शामिल नहीं करते।
एरोन

जवाबों:


7

ओरेकल में USING INDEX क्लॉज के बराबर SQL Server 2008 है?

जब आप SQL सर्वर में एक प्राथमिक कुंजी या विशिष्ट बाधा बनाते हैं, तो एक ही कुंजी के साथ स्वचालित रूप से बनाई गई उस बाधा का समर्थन करने के लिए एक अद्वितीय सूचकांक।

जिसका अर्थ यह प्रतीत होता है कि प्राथमिक कुंजी के लिए किस सूचकांक का उपयोग किया जाना चाहिए, यह निर्दिष्ट करने का एक तरीका है।

नहीं। दस्तावेज़ीकरण केवल यह बताने का प्रयास कर रहा है कि क्या आप निर्दिष्ट नहीं करते हैं, तो स्वचालित समर्थन सूचकांक को क्लस्टर या गैर-संकुल के रूप में बनाया जाएगा। यह भ्रमित करने वाला शब्द है, मैं सहमत हूं।

स्पष्ट करने के लिए, जब आप किसी प्राथमिक तालिका में एक प्राथमिक कुंजी बाधा को एक वरीयता व्यक्त किए बिना जोड़ते हैं, तो तालिका में पहले से मौजूद संकुल सूचकांक नहीं होने पर सहायक सूचकांक को क्लस्टर किया जाएगा । यदि पहले से ही क्लस्टर इंडेक्स है, तो सहायक सूचकांक को गैर-संकुलित बनाया जाएगा

आप विशेष रूप से एक संकुल या गैर-प्राथमिक प्राथमिक कुंजी का अनुरोध कर सकते हैं: PRIMARY KEY CLUSTEREDया PRIMARY KEY NONCLUSTERED

निष्पक्षता में, इस विषय पर प्रलेखन बहुत स्पष्ट है:

table_constraint (Transact-SQL)


5

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%%मान इंडेक्स में ही पृष्ठों का प्रतिनिधित्व करते हैं।

परिणाम:

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.