복붙노트

[SQL] 테이블 변수에 인덱스를 생성

SQL

테이블 변수에 인덱스를 생성

당신은 2000 SQL Server에서 테이블 변수에 인덱스를 만들 수 있습니까?

DECLARE @TEMPTABLE TABLE (
        [ID] [int] NOT NULL PRIMARY KEY
        ,[Name] [nvarchar] (255) COLLATE DATABASE_DEFAULT NULL 
)

나는 이름에 인덱스를 만들 수 있습니까?

해결법

  1. ==============================

    1.문제는 SQL Server 2000의 태그되지만 최신 버전을 개발하는 사람들의 이익을 위해 내가 먼저 그 주소 것입니다.

    문제는 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 서버 2016은 조금 더이 이완 그러나 포함 된 열이 필터링 된 인덱스와 인덱스는 현재이 구문을 사용하여 선언 할 수 없습니다. CTP 3.1에서 테이블 변수에 대한 필터링 된 인덱스를 선언하는 것이 가능하다. RTM까지 포함 컬럼도 허용되는 경우가 있습니다 만, 현재 위치은 "가능성으로 인해 자원 제약에 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 Server의 전통 테이블 중 하나 클러스터 된 인덱스를 가질 수 있습니다 또는 힙으로 구성되어 있습니다.

    클러스터 된 인덱스는 하나가 아닌 독특한에 중복 키 값 또는 기본을 허용하는 독특한로 선언 할 수 있습니다. 하지 고유 한 다음 SQL 서버가 자동으로 중복 키에 uniqueifier를 추가하면 그들 고유 확인합니다.

    비 클러스터 인덱스는 명시 적으로 독특한로 선언 할 수 있습니다. 그렇지 않으면 고유하지 않은 경우에 대한 SQL Server는 모든 인덱스 키 (다만 중복)이 다시 그들이 고유 보장에 행 로케이터 (클러스터 된 인덱스 키 또는 힙 RID)를 추가합니다.

    SQL 서버 2000 - 테이블 변수에 2,012 인덱스에만 UNIQUE 또는 PRIMARY KEY 제약 조건을 생성하여 암시 적으로 생성 할 수 있습니다. 이러한 제약 형태의 차이는 기본 키가 아닌 널 컬럼 (들)에 있어야한다는 것이다. 고유 제한 조건에 참여하는 열은 널 (NULL) 일 수 있습니다. (널 (NULL)의 존재에 고유 제한 조건의 SQL 서버의 구현은 SQL 표준에 지정된 당 아니지만). 또한 테이블은 하나의 기본 키하지만 여러 고유 제한 조건을 가질 수 있습니다.

    이러한 논리적 제약은 모두 물리적으로 고유 인덱스로 구현됩니다. 명시 적으로 지정하지 않으면 그렇지 않으면 PRIMARY KEY가 클러스터 된 인덱스와 고유 제한 조건이 아닌 클러스터가 될 것이다 그러나이 동작은 제약 선언으로 명시 적으로 CLUSTERED 또는 NONCLUSTERED를 지정하여 대체 할 수 있습니다 (예 구문)

    DECLARE @T TABLE
    (
    A INT NULL UNIQUE CLUSTERED,
    B INT NOT NULL PRIMARY KEY NONCLUSTERED
    )
    

    2012 - 다음 인덱스 위의 결과로 암시 적으로 2000 SQL 서버에서 테이블 변수를 만들 수 있습니다.

    +-------------------------------------+-------------------------------------+
    |             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                                 |
    +-------------------------------------+-------------------------------------+
    

    마지막 하나는 약간의 설명이 필요합니다. 이 답변의 시작 부분에 테이블 변수 정의에서 이름에 비 고유 비 클러스터형 인덱스는 이름, ID (SQL 서버가 자동으로 어쨌든 비 독특한 NCI 키에 클러스터 된 인덱스 키를 추가한다고 리콜)에 고유 인덱스에 의해 시뮬레이션된다.

    비 고유 클러스터 인덱스는 uniqueifier를 수동으로 작동하는 IDENTITY 열을 추가함으로써 달성 될 수있다.

    DECLARE @T TABLE
    (
    A INT NULL,
    B INT NULL,
    C INT NULL,
    Uniqueifier INT NOT NULL IDENTITY(1,1),
    UNIQUE CLUSTERED (A,Uniqueifier)
    )
    

    그러나 이것은이 모든 행에 "uniqueifier를"을 추가로 비 고유 클러스터형 인덱스는 일반적으로 실제로 SQL 서버에서 구현 될 것입니다 방법에 대한 정확한 시뮬레이션이 아니다. 다만 그것을 필요로하는.

  2. ==============================

    2.성능의 관점에서 @temp 테이블과 변수를 선호 #temp 테이블 사이에 차이가 존재하지 않는 것으로 이해되어야한다. 그들은 같은 장소 (tempdb의)에 상주하며 같은 방식으로 구현된다. 모든 차이는 추가 기능에 나타납니다. https://dba.stackexchange.com/questions/16385/whats-the-difference-between-a-temp-table-and-table-variable-in-sql-server/16386#16386이 놀라 울 정도로 완벽한 작성자를 참조하십시오

    성능의 관점에서 @temp 테이블과 변수를 선호 #temp 테이블 사이에 차이가 존재하지 않는 것으로 이해되어야한다. 그들은 같은 장소 (tempdb의)에 상주하며 같은 방식으로 구현된다. 모든 차이는 추가 기능에 나타납니다. https://dba.stackexchange.com/questions/16385/whats-the-difference-between-a-temp-table-and-table-variable-in-sql-server/16386#16386이 놀라 울 정도로 완벽한 작성자를 참조하십시오

    임시 테이블 전에 v2016에 다른 ​​대부분의 경우에, 테이블 또는 스칼라 함수에서 같은 사용할 수없는 경우가 있지만 (심지어 필터링 된 인덱스는 테이블 변수에 추가 할 수있는) 당신은 단순히 #temp 테이블을 사용할 수 있습니다.

    tempdb의 이름 인덱스 (또는 제한)를 사용의 단점은 이름이 다음 충돌 할 수 있다는 것입니다. 다만 이론적으로 #temp 테이블의 복사본에 같은 인덱스를 넣어 시도 할 것이다 절차 자체의 다른 인스턴스와 아주 쉽게 종종 다른 절차 만에.

    이름 충돌을 방지하기 위해이 같은 일반적으로 작동합니다 :

    declare @cmd varchar(500)='CREATE NONCLUSTERED INDEX [ix_temp'+cast(newid() as varchar(40))+'] ON #temp (NonUniqueIndexNeeded);';
    exec (@cmd);
    

    이 이름도 동일한 절차의 동시 실행 사이에 항상 고유 보장한다.

  3. ==============================

    3.테이블 변수가 큰 데이터 다음 대신 테이블 변수 (@Table) 임시 테이블을 작성되어있는 경우 (#table) .table 변수를 삽입 한 후 인덱스를 생성 할 수 없습니다.

    테이블 변수가 큰 데이터 다음 대신 테이블 변수 (@Table) 임시 테이블을 작성되어있는 경우 (#table) .table 변수를 삽입 한 후 인덱스를 생성 할 수 없습니다.

     CREATE TABLE #Table(C1 int,       
      C2 NVarchar(100) , C3 varchar(100)
      UNIQUE CLUSTERED (c1) 
     ); 
    
  4. from https://stackoverflow.com/questions/886050/creating-an-index-on-a-table-variable by cc-by-sa and MIT license