प्रश्न SQL Server 2000 को टैग किया गया है, लेकिन नवीनतम संस्करण पर विकसित लोगों के लाभ के लिए मैं इसे पहले संबोधित करूंगा।
SQL सर्वर 2014
SQL सर्वर 2014 के नीचे चर्चा की गई बाधा आधारित इंडेक्स को जोड़ने के तरीकों के अलावा, गैर-अनूठे इंडेक्स को टेबल चर घोषणाओं पर इनलाइन सिंटैक्स के साथ सीधे निर्दिष्ट करने की अनुमति देता है।
उसके लिए उदाहरण वाक्य रचना नीचे है।
/*SQL Server 2014+ compatible inline index syntax*/
DECLARE @T TABLE (
C1 INT INDEX IX1 CLUSTERED, /*Single column indexes can be declared next to the column*/
C2 INT INDEX IX2 NONCLUSTERED,
INDEX IX3 NONCLUSTERED(C1,C2) /*Example composite index*/
);
शामिल किए गए स्तंभों के साथ फ़िल्टर्ड इंडेक्स और इंडेक्स वर्तमान में इस सिंटैक्स के साथ घोषित नहीं किए जा सकते हैं, हालांकि SQL Server 2016 इसे थोड़ा और आराम देता है। CTP 3.1 से अब टेबल वेरिएबल्स के लिए फ़िल्टर्ड इंडेक्स घोषित करना संभव है। आरटीएम द्वारा यह ऐसा मामला हो सकता है जिसमें स्तंभों को भी शामिल किया गया है, लेकिन वर्तमान स्थिति यह है कि वे "संभवतः संसाधन बाधाओं के कारण इसे SQL16 में नहीं बनाएंगे"
/*SQL Server 2016 allows filtered indexes*/
DECLARE @T TABLE
(
c1 INT NULL INDEX ix UNIQUE WHERE c1 IS NOT NULL /*Unique ignoring nulls*/
)
SQL सर्वर 2000 - 2012
क्या मैं नाम पर एक सूचकांक बना सकता हूं?
संक्षिप्त उत्तर: हां।
DECLARE @TEMPTABLE TABLE (
[ID] [INT] NOT NULL PRIMARY KEY,
[Name] [NVARCHAR] (255) COLLATE DATABASE_DEFAULT NULL,
UNIQUE NONCLUSTERED ([Name], [ID])
)
एक अधिक विस्तृत जवाब नीचे है।
SQL सर्वर में पारंपरिक तालिकाओं में या तो संकुल अनुक्रमणिका हो सकती है या उन्हें ढेर के रूप में संरचित किया जाता है ।
क्लस्टर इंडेक्स या तो डुप्लिकेट कुंजी मान को अस्वीकार करने के लिए या गैर अद्वितीय के लिए डिफ़ॉल्ट के रूप में घोषित किए जा सकते हैं। नहीं अनूठा तो एसक्यूएल सर्वर चुपचाप एक जोड़ता है, तो uniqueifier उन्हें अद्वितीय बनाने के लिए किसी भी डुप्लिकेट चाबी है।
गैर-संकुलित सूचकांक को भी स्पष्ट रूप से अद्वितीय घोषित किया जा सकता है। अन्यथा नॉन यूनिक केस के लिए SQL Server सभी इंडेक्स कीज़ (न केवल डुप्लिकेट्स) के लिए पंक्ति लोकेटर (क्लस्टर इंडेक्स की या RID को ढेर के लिए) जोड़ता है, यह फिर से सुनिश्चित करता है कि वे अद्वितीय हैं।
SQL सर्वर 2000 - 2012 में तालिका चर पर अनुक्रमित केवल एक UNIQUE
या PRIMARY KEY
बाधा बनाकर निहित किया जा सकता है । इन बाधा प्रकारों के बीच अंतर यह है कि प्राथमिक कुंजी गैर अशक्त स्तंभ (ओं) पर होनी चाहिए। एक अद्वितीय बाधा में भाग लेने वाले स्तंभ अशक्त हो सकते हैं। (हालांकि एस की मौजूदगी में एसक्यूएल सर्वर के अनूठे अवरोधों का कार्यान्वयन NULL
एसक्यूएल स्टैंडर्ड में निर्दिष्ट प्रति के अनुसार नहीं है)। इसके अलावा एक टेबल में केवल एक प्राथमिक कुंजी लेकिन कई अद्वितीय बाधाएं हो सकती हैं।
इन दोनों तार्किक बाधाओं को शारीरिक रूप से एक अद्वितीय सूचकांक के साथ लागू किया जाता है। यदि स्पष्ट रूप से निर्दिष्ट नहीं किया PRIMARY KEY
गया है, तो संकुल अनुक्रमणिका बन जाएगी और अद्वितीय अवरोध गैर-संकुल हो जाएंगे, लेकिन इस व्यवहार को स्पष्ट रूप से निर्दिष्ट करने CLUSTERED
या NONCLUSTERED
बाधा घोषणा के साथ ओवरराइड किया जा सकता है (उदाहरण वाक्य रचना)
DECLARE @T TABLE
(
A INT NULL UNIQUE CLUSTERED,
B INT NOT NULL PRIMARY KEY NONCLUSTERED
)
उपरोक्त के परिणामस्वरूप निम्न अनुक्रमणिका को SQL Server 2000 - 2012 में तालिका चर पर बनाया जा सकता है।
+-------------------------------------+-------------------------------------+
| Index Type | Can be created on a table variable? |
+-------------------------------------+-------------------------------------+
| Unique Clustered Index | Yes |
| Nonunique Clustered Index | |
| Unique NCI on a heap | Yes |
| Non Unique NCI on a heap | |
| Unique NCI on a clustered index | Yes |
| Non Unique NCI on a clustered index | Yes |
+-------------------------------------+-------------------------------------+
पिछले एक स्पष्टीकरण की आवश्यकता है। इस उत्तर की शुरुआत में तालिका चर परिभाषा में गैर अद्वितीय गुच्छेदार सूचकांक पर Name
एक अद्वितीय सूचकांक द्वारा अनुकरण किया जाता है Name,Id
(याद रखें कि SQL सर्वर चुपचाप गैर अद्वितीय NCI कुंजी के लिए संकुल सूचकांक कुंजी जोड़ देगा)।
एक अनूठे क्लस्टर्ड इंडेक्स IDENTITY
को एक यूनीकफायर के रूप में कार्य करने के लिए मैन्युअल रूप से एक कॉलम जोड़कर भी प्राप्त किया जा सकता है ।
DECLARE @T TABLE
(
A INT NULL,
B INT NULL,
C INT NULL,
Uniqueifier INT NOT NULL IDENTITY(1,1),
UNIQUE CLUSTERED (A,Uniqueifier)
)
लेकिन यह एक सटीक सिमुलेशन नहीं है कि एक गैर अद्वितीय क्लस्टर इंडेक्स सामान्य रूप से वास्तव में SQL सर्वर में कैसे लागू किया जाएगा क्योंकि यह "अद्वितीय" सभी पंक्तियों में जोड़ता है। सिर्फ वे ही नहीं जिनकी आवश्यकता है।