IT

SQL Server를 사용하여 CREATE TABLE 문 내에 클러스터되지 않은 고유하지 않은 인덱스 생성

itgroup 2023. 5. 28. 20:36
반응형

SQL Server를 사용하여 CREATE TABLE 문 내에 클러스터되지 않은 고유하지 않은 인덱스 생성

SQL Server CREATE TABLE 문 내에 기본 키 또는 고유 인덱스를 만들 수 있습니다.CREATE TABLE 문 내에 고유하지 않은 인덱스를 만들 수 있습니까?

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

다시 말하지만, 목표는 CREATE TABLE 문 뒤가 아니라 문 내에 고유하지 않은 인덱스를 만드는 것입니다.

[SQL Server Books Online for CREATE TABLE] 항목은 도움이 되지 않았습니다.

또한 [이 질문]은 거의 동일하지만 허용된 답변이 적용되지 않습니다.

SQL 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 standard non-clustered index on (d, e)
    ,INDEX IX_MyTable4 NONCLUSTERED (d, e)
);
GO

SQL 2014 이전 버전에서는 CREATE/ALTER TABLE은 인덱스가 아닌 추가할 CONSTARINT만 허용했습니다.기본 키와 고유 제약 조건이 인덱스 측면에서 구현된다는 것은 부작용입니다.

TLDR:

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

세부 사항

T-SQL CREATE TABLE 문서에 따르면 2014년 열 정의는 인덱스 정의를 지원합니다.

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

그리고 <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_indexName 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)
)

그건 별개의 진술입니다.

또한 테이블에 삽입하여 테이블에서 선택하고 동일한 문에 인덱스를 작성할 수도 없습니다.

BOL 항목에는 필요한 정보가 포함되어 있습니다.

클러스터된 | 비클러스터된
기본 키 또는 고유 제약 조건에 대해 클러스터된 인덱스 또는 비클러스터된 인덱스가 생성되었음을 나타냅니다. 기본 키 제약 조건은 클러스터된 상태이고 고유 제약 조건은 비클러스터된 상태입니다.

CREATE TABLE 문에서 CLUSTRED는 하나의 제약 조건에 대해서만 지정할 수 있습니다.고유 제약 조건에 대해 클러스터가 지정되고 기본 키 제약 조건도 지정되면 기본 키는 기본적으로 비클러스터로 설정됩니다.

PK 필드에는 인덱스를 생성할 수 있지만, 비PK 비고시 제약 필드에는 비클러스터형 인덱스를 생성할 수 없습니다.

NCL 인덱스는 테이블 구조와 관련이 없으며 테이블 내부의 데이터에 대한 제약 조건도 아닙니다.테이블을 지원하는 별도의 엔터티이지만 기능이나 설계에 필수적인 것은 아닙니다.

그렇기 때문에 별도의 진술입니다.설계 관점에서 NCL 지수는 표와 무관합니다(쿼리 최적화에도 불구하고).

테이블 작성 스크립트에서 인덱스를 작성하는 방법에 대한 허용된 답변은 저에게 적용되지 않았습니다.이 작업은 다음과 같습니다.

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])
)

외부 키는 인덱스를 만들지 않으므로 인덱스에 참여할 가능성이 높기 때문에 인덱스를 작성하는 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/6193293/create-a-nonclustered-non-unique-index-within-the-create-table-statement-with-sq

반응형