2009-07-26 7 views
38

nvarchar(max) 열에 제약 조건을 만들 수없는 이유는 무엇입니까? SQL Server에서는 고유 한 제약 조건을 적용 할 수 없습니다. 그러나 nvarchar(100) 열에 고유 한 제약 조건을 만들 수 있습니다.nvarchar (max)에 제약 조건을 넣을 수없는 이유는 무엇입니까?

두 열 모두 NOT NULL입니다. nvarchar(max) 열에 제약 조건을 추가 할 수없는 이유가 있습니까?

답변

23

MAX는 실제로 (2 -1 바이트) 큽니다. 서버가 멀티 메가 크기 항목의 고유성을 검사해야하는 경우 서버 붕괴가 발생할 수 있습니다.

Create Index에 대한 문서에서 고유 한 제약 조건에 대해서도 마찬가지라고 가정합니다.

결합 인덱스 값의 최대 허용 크기는 900 바이트입니다.

편집 : 당신이 정말로 고유성을 필요로하는 경우, 당신은 잠재적으로 데이터의 해시를 계산하고 고유 인덱스에 그 저장하여 대략 수 있습니다. 큰 해시조차도 색인 가능 열에 들어가기에 충분히 작습니다. 충돌을 처리하는 방법을 알아 내야합니다. 잘못된 충돌이 발견되면 충돌을 수동으로 확인하고 데이터를 채 웁니다 (해시 변경).

+0

그런 이유로 인덱스가 될 수있는 최대 값이 설정 되었습니까 아니면 'MAX가 아닌'것입니까? –

+0

MAX를 사용하지 않는 한'nvarchar'와'varchar'의 최대 길이는 8000 범위의 어딘가에 있다고 생각합니다. – Thorarin

+1

인덱스의 모든 키 열의 최대 총 크기는 900 바이트입니다. http://msdn.microsoft.com/en-us/library/ms191241.aspx –

4

고유 제약 조건은 실제로 인덱스이며 nvarchar (max)는 인덱스의 키로 사용할 수 없습니다.

72

nvarchar(max)은 실제로는 nvarchar(integer-length)과 다른 데이터 유형입니다. 이 특성은 더 이상 사용되지 않는 text 데이터 형식과 유사합니다. nvarchar(max) 값이 너무 커지면

, text 마찬가지로 외부 행 (행이 8000 바이트의 최대 구속)과 포인터가 열 자체에 저장되어 저장된다. 큰 필드를 효율적으로 인덱싱 할 수 없으며 데이터가 다른 곳에 저장 될 수 있다는 사실은 인덱스 검색 및 스캔을 더욱 복잡하게 만듭니다.
고유 한 제약 조건을 적용하려면 인덱스를 적용해야하므로 SQL Server 디자이너는 고유 한 제약 조건을 만들지 않기로 결정했습니다.

+5

물론, CRC 또는 MD5 버전을 사용하여 과도하게 높은 확률로 확인하기 위해 제약 조건을 저렴하게 만들 수있었습니다. 어쨌든; 그들은하지 않았다 ... –

+0

설명 주셔서 감사합니다, 당신은 내가 할 수있는 것보다 더 잘 설명하는 것을 도왔습니다! –

관련 문제