SQL सर्वर के साथ क्रिएट टेबल स्टेटमेंट के भीतर एक गैर-सूचीबद्ध गैर-अद्वितीय इंडेक्स बनाएं


92

SQL सर्वर बनाएँ तालिका कथन में एक प्राथमिक कुंजी या अनन्य अनुक्रमणिका बनाना संभव है। क्या क्रिएट टेबल स्टेटमेंट के भीतर एक नॉन-यूनिक इंडेक्स बनाना संभव है ?

CREATE TABLE MyTable(
    a int NOT NULL
    ,b smallint NOT NULL
    ,c smallint NOT NULL
    ,d smallint NOT NULL
    ,e smallint NOT NULL

    -- This creates a primary key
    ,CONSTRAINT PK_MyTable PRIMARY KEY CLUSTERED (a)

    -- This creates a unique nonclustered index on columns b and c
    ,CONSTRAINT IX_MyTable1 UNIQUE (b, c)

    -- Is it possible to create a non-unique index on columns d and e here?
    -- Note: these variations would not work if attempted:
    -- ,CONSTRAINT IX_MyTable2 INDEX (d, e)
    -- ,CONSTRAINT IX_MyTable3 NONCLUSTERED INDEX (d, e)
);
GO

-- The proposed non-unique index should behave identically to
-- an index created after the CREATE TABLE statement. Example:
CREATE NONCLUSTERED INDEX IX_MyTable4 ON MY_TABLE (d, e);
GO

फिर, लक्ष्य क्रिएट टेबल स्टेटमेंट के भीतर नॉन-यूनिक इंडेक्स बनाना है, उसके बाद नहीं।

जो इसके लायक है, उसके लिए मुझे सहायक होने के लिए [SQL Server Books ऑनलाइन प्रविष्टि के लिए प्रविष्टि] नहीं मिली ।

इसके अलावा, [यह प्रश्न] लगभग समान है, लेकिन स्वीकृत उत्तर लागू नहीं होता है।

जवाबों:


122

आप नहीं कर सकते। सृजन / परिवर्तन तालिका केवल अनुक्रमणिका को जोड़ने के लिए स्वीकार करती है, अनुक्रमित नहीं। सूचकांक के संदर्भ में प्राथमिक कुंजी और अद्वितीय बाधाओं को लागू करने का तथ्य एक दुष्प्रभाव है। अनुक्रमणिका का प्रबंधन करने के लिए, आपके पास अच्छी तरह से वाकिफ होने के साथ सृजन / बदलाव / ड्रॉप इंडेक्स है।

क्रिएट टेबल स्टेटमेंट में गैर-विशिष्ट-नॉन-क्लस्टर्ड इंडेक्स को जोड़ने के लिए आपको ऐसी आवश्यकता क्यों है?

ध्यान दें कि SQL Server 2014 ने इनलाइन इंडेक्स क्रिएट विकल्प प्रस्तुत किया है :

CREATE TABLE MyTable(
    a int NOT NULL
    ,b smallint NOT NULL
    ,c smallint NOT NULL
    ,d smallint NOT NULL
    ,e smallint NOT NULL

    -- This creates a primary key
    ,CONSTRAINT PK_MyTable PRIMARY KEY CLUSTERED (a)

    -- This creates a unique nonclustered index on columns b and c
    ,CONSTRAINT IX_MyTable1 UNIQUE (b, c)

    -- This creates a non-clustered index on (d, e)
    ,INDEX IX_MyTable4 NONCLUSTERED (d, e)
);
GO

17
महान विवरण के लिए धन्यवाद! क्यों? विशुद्ध रूप से सौंदर्य कारणों से। मुझे लगा कि स्क्रिप्ट पढ़ने वाले किसी के लिए भी सुविधाजनक हो सकता है यदि सभी बाधाओं / अनुक्रमकों को एक ही कथन में समाहित किया जाए। व्यक्तिगत रूप से, मुझे यह जानना पसंद है कि क्या किसी विदेशी कुंजी के स्तंभों में भी एक सूचकांक है, और यह एक ही कथन में तार्किक रूप से इस जानकारी को समूहित करने का एक अच्छा तरीका हो सकता है।
माइक

मुझे लग गया Error: (1146) Table 'tablename' doesn't exist, हाहाहा, विडंबना
Aminah Nuraini

13

के रूप में प्रति T-SQL टेबल बनाएं प्रलेखन, 2014 में स्तंभ परिभाषा एक सूचकांक को परिभाषित करने का समर्थन करता है:

<column_definition> ::=  
column_name <data_type>  
    ...
    [ <column_index> ]  

और व्याकरण को इस प्रकार परिभाषित किया गया है:

<column_index> ::=   
 INDEX index_name [ CLUSTERED | NONCLUSTERED ]  
    [ WITH ( <index_option> [ ,... n ] ) ]  
    [ ON { partition_scheme_name (column_name )   
         | filegroup_name  
         | default   
         }  
    ]   
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]  

तो आप एक अलग स्टेटमेंट के रूप में क्या कर सकते हैं, इनलाइन बहुत कुछ किया जा सकता है। मैंने देखा includeकि इस व्याकरण में कोई विकल्प नहीं है इसलिए कुछ चीजें संभव नहीं हैं।

CREATE TABLE MyTable(
    a int NOT NULL
    ,b smallint NOT NULL index IX_MyTable_b nonclustered
    ,c smallint NOT NULL
    ,d smallint NOT NULL
    ,e smallint NOT NULL
)

आप कॉलम के बाद एक अन्य लाइन के रूप में इनलाइन इंडेक्स को भी परिभाषित कर सकते हैं, लेकिन बनाएँ तालिका विवरण के भीतर, और यह इंडेक्स में कई कॉलम की अनुमति देता है, लेकिन फिर भी कोई includeखंड नहीं है:

< table_index > ::=   
{  
    {  
      INDEX index_name [ CLUSTERED | NONCLUSTERED ]   
         (column_name [ ASC | DESC ] [ ,... n ] )   
    | INDEX index_name CLUSTERED COLUMNSTORE  
    | INDEX index_name [ NONCLUSTERED ] COLUMNSTORE (column_name [ ,... n ] )  
    }  
    [ WITH ( <index_option> [ ,... n ] ) ]   
    [ ON { partition_scheme_name (column_name )   
         | filegroup_name  
         | default   
         }  
    ]   
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]  

}   

उदाहरण के लिए यहाँ हम दोनों स्तंभों पर एक सूचकांक जोड़ते हैं c और d:

CREATE TABLE MyTable(
    a int NOT NULL
    ,b smallint NOT NULL index IX_MyTable_b nonclustered
    ,c smallint NOT NULL
    ,d smallint NOT NULL
    ,e smallint NOT NULL

    ,index IX_MyTable_c_d nonclustered (c,d)
)

1
यह बहुत अच्छा काम करता है, और BOL के अनुसार यह कम से कम 2008 तक वापस चला जाता है। ओपी की तरह, मुझे वह कोड मिलता है जिसे मैं ज्यादातर देखता हूं (आमतौर पर एसएसएमएस द्वारा उत्पन्न) मेरी आंखों को चोट पहुंचाता है, और मुझे तर्कसंगत मानव के लिए समझ बनाने के लिए मेरी तालिका परिभाषाएं पसंद हैं। धन्यवाद।
वेड हैटलर

8

यह एक अलग बयान है।

तालिका में सम्मिलित करना और उसमें से चयन करना और एक ही कथन में एक सूचकांक बनाना भी संभव नहीं है।

BOL प्रविष्टि में आपके द्वारा आवश्यक जानकारी शामिल है:

CLUSTERED | गैर-प्रेरित
संकेत है कि एक क्लस्टर या एक nonclustered सूचकांक प्राथमिक कुंजी या अद्वितीय बाधा के लिए बनाया गया है। प्राथमिक कुंजी, डिफ़ॉल्ट रूप से संकुचित, और UNIQUE बाधाओं को NONCLUSTERED के लिए डिफ़ॉल्ट बनाता है।

क्रिएट टेबल स्टेटमेंट में, क्लस्टर्ड केवल एक बाधा के लिए निर्दिष्ट किया जा सकता है। यदि एक UNIQUE बाधा के लिए CLUSTERED निर्दिष्ट है और एक PRIMARY कुंजी बाधा भी निर्दिष्ट है, तो प्राथमिक कुंजी NONCLUSTERED के लिए चूक जाती है।

आप पीके फ़ील्ड पर एक इंडेक्स बना सकते हैं, लेकिन नॉन-पीके नॉन-यूनिक-कंस्ट्रक्शन फील्ड पर नॉन-क्लस्टर्ड इंडेक्स नहीं।

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

इसलिए यह एक अलग बयान है। एनसीएल सूचकांक एक डिजाइन परिप्रेक्ष्य (क्वेरी अनुकूलन के बावजूद) से तालिका के लिए अप्रासंगिक है।


7

तालिका निर्माण स्क्रिप्ट का इंडेक्स इनलाइन बनाने के तरीके का स्वीकृत उत्तर मेरे काम नहीं आया। यह किया:

CREATE TABLE [dbo].[TableToBeCreated]
(
    [Id] BIGINT IDENTITY(1, 1) NOT NULL PRIMARY KEY
    ,[ForeignKeyId] BIGINT NOT NULL
    ,CONSTRAINT [FK_TableToBeCreated_ForeignKeyId_OtherTable_Id] FOREIGN KEY ([ForeignKeyId]) REFERENCES [dbo].[OtherTable]([Id])
    ,INDEX [IX_TableToBeCreated_ForeignKeyId] NONCLUSTERED ([ForeignKeyId])
)

याद रखें, फॉरेन कीज़ इंडेक्स नहीं बनाते हैं, इसलिए उन्हें इंडेक्स करना अच्छा है क्योंकि आप उन पर शामिल होने की संभावना से अधिक होंगे।


मैं उस अंतिम कथन का पालन नहीं कर रहा हूं। मैं उस कथन से सहमत होता अगर विदेशी कुंजी द्वारा आपकी तालिका को क्वेरी करने के लिए सामान्य रूप से अभ्यास किया जाता है; लेकिन बस नहीं कि आप इस पर शामिल हों इसलिए इसे अनुक्रमित किया जाना चाहिए। उदाहरण: कंपनी आईडी X के सभी कर्मचारियों और उनकी कंपनी का नाम खोजें - फिर सुनिश्चित करें कि FK पर एक सूचकांक मदद करता है। अंतिम नाम ए के साथ शुरू करने वाले सभी कर्मचारियों और उनकी कंपनी का नाम खोजें; FK पर अनुक्रमणिका मदद नहीं करती है। दूसरे शब्दों में, मुझे यकीन नहीं है कि "क्योंकि आप इस पर शामिल होते हैं, आपको इसे अनुक्रमित करना चाहिए" अच्छा अभ्यास है। क्या मैं कुछ भूल रहा हूँ?
पॉल

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