인덱스에서 키 열로 사용할 수없는 유형입니다.


180

에 오류가 있습니다

Column 'key' in table 'misc_info' is of a type that is invalid for use as a key column in an index.

여기서 key는 nvarchar (max)입니다. 빠른 구글 이 이것을 찾았습니다 . 그러나 솔루션이 무엇인지 설명하지는 않습니다. 키와 값이 모두 문자열이고 키가 고유하고 단일 해야하는 사전과 같은 것을 어떻게 만들 수 있습니까? 내 SQL 문은

create table [misc_info] (
[id] INTEGER PRIMARY KEY IDENTITY NOT NULL,
[key] nvarchar(max) UNIQUE NOT NULL,
[value] nvarchar(max) NOT NULL);

16
당신의 키가 (잠재적으로) 4GB의 크고 독창적이어야합니까? 고유성을 검사하는 시간이 많이 걸리는 작업 일 수 있으므로 SqlServer에서는이를 허용하지 않습니다 .
클라우스 비 스코프 페데르센

@KlausByskovPedersen PostgreSQL과 같은 더 강력한 DBMS는 그것을 가능하게하고 대신 다이제스트를 색인 할 수있을만큼 똑똑합니다. 그러나 당신은 요점을 가지고 있습니다.
Matthieu

답변:


244

고유 제한 조건은 행당 8000 바이트를 초과 할 수 없으며 처음 900 바이트 만 사용하므로 키의 가장 안전한 최대 크기는 다음과 같습니다.

create table [misc_info]
( 
    [id] INTEGER PRIMARY KEY IDENTITY NOT NULL, 
    [key] nvarchar(450) UNIQUE NOT NULL, 
    [value] nvarchar(max) NOT NULL
)

즉, 키는 450자를 초과 할 수 없습니다. varchar대신 nvarchar여러 코드 페이지에서 문자를 저장할 필요가없는 경우로 전환 할 수 있으면 900 자로 증가 할 수 있습니다.


1
varchar의 경우 제한은 여전히 ​​varchar (450)입니까?
Steam

9
varchar(900)OR 을 사용할 공간이 있습니다 nvarchar(450).
Daniel Renshaw

내 이해는 varchar이 항목의 길이를 결정하는 데 4 바이트가 걸리므로 실제 제한은 varchar (896)이어야 함을 의미합니다. 이 올바른지?
mrmillsy

2
@mrmillsy 선언 된 최대 크기에는 오버 헤드 (4가 아닌 2 바이트)가 포함되지 않으며 오버 헤드 바이트는 최대 인덱스 행 크기 제한에 포함되지 않습니다. technet.microsoft.com/ko-kr/library/ms176089(v=sql.100).aspx
Daniel Renshaw 2014 년

1
@mrmillsy ID1 int색인에를 포함하여 해당 메시지가 나타납니다 . 즉 int의 900 바이트에 추가로 4 바이트가 필요합니다 varchar.
Daniel Renshaw

33

SQL Server (2008 R2까지)에는 varchar (MAX) 및 nvarchar (MAX) (및 text, ntext와 같은 여러 다른 유형)를 인덱스에 사용할 수 없다는 제한이 있습니다. 다음 두 가지 옵션이 있습니다.
1. 키 필드에서 제한된 크기를 설정하십시오. 예. nvarchar (100)
2. 값을 테이블의 모든 키와 비교하는 검사 제한 조건을 작성하십시오. 조건은 다음과 같습니다.

([dbo].[CheckKey]([key])=(1))

그리고 [dbo]. [CheckKey]는 다음과 같이 정의 된 스칼라 함수입니다.

CREATE FUNCTION [dbo].[CheckKey]
(
    @key nvarchar(max)
)
RETURNS bit
AS
BEGIN
    declare @res bit
    if exists(select * from key_value where [key] = @key)
        set @res = 0
    else
        set @res = 1

    return @res
END

그러나 기본 인덱스는 검사 제한 조건보다 성능이 뛰어나므로 실제로 길이를 지정할 수 없으면 검사 제한 조건을 사용하지 마십시오.


영리합니다-방아쇠보다 좋습니다.
Neil Moss

14

유일한 해결책은 고유 색인에서 더 적은 데이터를 사용하는 것입니다. 키는 최대 NVARCHAR (450) 일 수 있습니다.

"SQL Server는 모든 인덱스 키 열의 최대 총 크기에 대한 900 바이트 제한을 유지합니다."

MSDN 에서 더 읽어보기


varchar의 경우 제한은 여전히 ​​varchar (450)입니까?
Steam


2

키 길이가 기가 바이트이어야한다는 사실에 대한 klaisbyskov의 의견을 지적하고 실제로 이것을 필요로한다고 가정하면 유일한 옵션은 다음과 같습니다.

  1. 키 값의 해시를 사용하십시오
    • nchar (40)에 열을 만듭니다 (예 : sha1 해시).
    • 해시 열에 고유 키를 넣습니다.
    • 레코드를 저장하거나 업데이트 할 때 해시 생성
  2. 삽입 또는 업데이트시 기존 일치에 대해 테이블을 쿼리하는 트리거입니다.

해싱에는 언젠가 는 충돌 이 발생할 수 있다는 경고가 있습니다 .

트리거는 전체 테이블을 스캔합니다.

너에게 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.