varchar (8000) 설정의 결과는 무엇입니까?


22

varchar는 필드 크기에 비례하여 디스크 공간을 차지하므로 varchar(8000)SQL Server에서 varchar를 항상 최대 값으로 정의하지 않아야하는 이유가 있습니까?

테이블 만들기에서 varchar(100)내가 하는 사람이 있으면 내가 잘못했다고 말해서는 안된다고해야합니까 varchar(8000)?


여기서는 create table 사용과 내장 프로 시저의 매개 변수 선언에서 사용을 구분해야한다고 생각합니다. 두 번째 해석은 내 질문 dba.stackexchange.com/questions/1772/…를
bernd_k

답변:


18
  • 길이는 데이터에 대한 제약 조건입니다 (예 : CHECK, FK, NULL 등)
  • 행이 8060 바이트를 초과 할 때의 성능
  • 고유 제한 조건 또는 색인을 가질 수 없습니다 (키 열 너비는 <900이어야 함)
  • 기본값은 SET ANSI PADDING ON = 많은 후행 공백이 저장 될 가능성입니다.
  • SQL Server는 정렬 작업의 평균 길이가 4000이라고 가정하고 이것을 기반으로 메모리를 할당합니다 (이를 백업 할 링크를 찾아야하지만 내가하는 동안 녹슬지 않습니다 :-)

요약 :하지 마십시오.


행이 8060 바이트를 초과 할 때의 성능 . 그것은 실제 사용 된 바이트를 나타내며 최대 허용 바이트가 아닙니까?
bernd_k

@bernd_k : 8060 = 단일 8192 페이지에 맞는 한 행에 대한 최대 데이터 양. 행 오버 헤드를 포함하십시오. 나머지 (132 바이트) = 페이지 오버 헤드
gbn

즉, 더 큰 크기를 실제로 사용할 때 성능이 떨어지고 순수한 사실이 아니라 사용이 허용된다는 의미입니다.
bernd_k

@bernd_k : 성능 저하는 1. 정렬 등을위한 메모리 할당으로 인해 발생합니다. 2. 행 오버플로 (> 8060 바이트). 각 varchar (8000)에 10 개의 문자가 있다는 사실은 이러한 조건이 충족 될 때까지 관련이 없습니다 (SQL은 나중에 인덱스 키의 잠재적 오류에 대해 경고합니다)
gbn

정렬이 평균 50자를 가정하기 때문에 100 바이트 길이의 필드로 채워진 varchar (100) 열을 사용하여 테이블을 정렬합니까?
bernd_k

7

SQL Server를 언급한다고 가정하면 하나를 생각할 수 있습니다.

테이블에 행의 크기 (8K)에 제한이 있으며 SQL을 사용하면 이론적으로 해당 제한을 초과 할 수있는 varchar 필드를 정의 할 수 있습니다. 따라서 관련 필드에 데이터를 너무 많이 넣으면 오류가 발생할 수 있습니다.

SQL 2K8부터는이 한계를 초과 할 수 있지만 성능에 영향을 미칩니다 .

또한 데이터가 예상되는 크기로 크기를 제한하는 전체 합리성 검사가 있습니다. 무한 길이의 필드를 원한다면 text 또는 ntext와 함께 가지 않겠습니까?


따라서 text 및 ntext 데이터 형식이 성능에 영향을 미치지 않는 방식으로 저장됩니까?
차드

실제 데이터는 나머지 열과 인라인하지 않고 덮개 아래의 별도 테이블에 저장되므로 이러한 유형은 테이블의 8K 행 크기 제한에 크게 영향을 미치지 않습니다. 여전히 성능에 영향을 미치지 만 다른 이유로 인해 영향을 미칩니다. varchar 및 nvarchar와 비교할 때 이러한 필드의 기능 지원에 대한 제한도 있습니다.
JohnFx

text 및 ntext는 varchar (max)를 위해 더 이상 사용되지 않습니다.
Phil Helmer

3

필드에 어떤 정보가 저장되어 있는지에 달려 있습니까?

여러 가지 이유로 최대 길이를 가지게 될 것입니다. 최대 길이가 있어야한다면 그것은 당신의 분야의 길이 여야합니다.

이론적으로 최대 길이가 없다면 varchar를 왜 사용할지 의문입니다.


3

필자는 Oracle Database에 대해 데이터베이스 열에 대해 가장 작은 필드 크기를 사용하면 한 가지 함정이 있음을 알게되었습니다.

단일 바이트 데이터 정렬이있는 데이터베이스에서 Oracle XE와 같은 다중 바이트 데이터 정렬이있는 데이터베이스로 가져 오기 내보내기를 통해 데이터를 이동하면 바이트 길이가 증가 할 수 있으며 가져 오기로 작성된 테이블로 데이터를 가져 오는 데 실패합니다. 물론 오라클은 varchar2 길이를 char 또는 byte로 정의 할 수 있습니다.

필자의 요점은 항상 가능한 한 작은 필드를 정의하는 것이 항상 현명한 것은 아니라는 것입니다. 나중에 필드 변경을 증가시키기 위해 많은 변경 테이블을 보았습니다 (변경된 요구 사항으로 인해).

사용하지 않는 필드가 20 %-100 % 인 것이 여기에서 논의 가능한 옵션입니다.

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