VARCHAR 열에 임의의 길이 제한을 추가해야합니까?


35

에 따르면 PostgreSQL을의 문서 ,이 사이에 성능 차이 없다 VARCHAR, VARCHAR(n)하고 TEXT.

이름 또는 주소 열에 임의의 길이 제한을 추가해야합니까 ?

편집 : 속지 않습니다 :

나는 그 CHAR유형이 과거의 유물 이라는 것을 알고 있으며 성능뿐만 아니라 Erwin과 같은 다른 장단점에도 놀라운 관심을 가지고 있습니다.

답변:


45

대답은 ' 아니요' 입니다. 피할 수있는 경우
길이 수정자를 추가하지 마십시오 varchar. 대부분의 경우 실제로 길이 제한이 필요하지 않습니다. 그냥 사용하는 text모든 문자 데이터. 확인되지 varchar는없는 RDBMS와 호환 유지해야하는 경우 (어떤 길이의 수정을) text.

성능은 거의 동일합니다 - text입니다 약간 빠른 드문 상황에서 , 그리고 길이에 대한 검사의주기 저장.

실제로 최대 길이를 적용 해야하는 경우 여전히 text그에 대한 점검 제한 조건 을 사용 하고 추가 하십시오 .

ALTER TABLE tbl ADD CONSTRAINT tbl_col_len CHECK (length(col) < 51);

테이블 정의 및 모든 종속 개체 (보기, 함수, 외래 키 등)를 망칠 필요없이 언제든지 이러한 제약 조건을 수정하거나 삭제할 수 있습니다.

길이 수정하면 단지로 실행 이 같은 문제 이나 이나 ...

PostgreSQL 9.1은 고통을 다소 완화시키는 새로운 기능을 도입했습니다. 릴리스 노트를 여기 인용 하십시오 .

허용 ALTER TABLE ... SET DATA TYPE적절한 경우에 테이블 재 작성을 방지하기 위해 (노아 쉬는 로버트 하스)

예를 들어, varchar열을 텍스트 로 변환 할 때 더 이상 테이블을 다시 쓰지 않아도됩니다. 그러나 varchar열의 길이 제한 조건을 늘리려면 여전히 테이블을 다시 작성해야합니다.


이 답변이 단순히 "실제 데이터베이스에 임의의 제한을 추가하지 않는 경우"라면 훨씬 더 좋을 것이라고 생각합니다. 나는이 답변에 많은 수정 사항과 추가 정보가 필요하다고 생각하지만 완전히 주제와 다르며 내가 완전히 동의 한 결론에 혼란을 줄 것입니다.
Evan Carroll

예, 모두 9.1-6 년 전의 Postgres 버전을 기반으로합니다. 지금은 조금 더럽지 만 기본 조언은 여전히 ​​좋습니다.
Erwin Brandstetter

온전한 검사를 위해 모든 텍스트 열에 검사 제한 조건을 추가하고 클라이언트의 버그가 매우 큰 텍스트를 삽입하여 모든 데이터베이스의 디스크 공간을 사용하지 않도록하는 것이 좋은 생각입니까?
코드

@ 코드 : 실행 가능한 옵션입니다. 제약 조건이 동일한 열이 많은 경우 domains를 고려하십시오 . 또는 varchar(n)결국, 단순성을 위해-단점이 일반적으로 당신에게 영향을 미치지 않는 경우. ( 실제 최대 길이를 적용하려는 경우에는 제한이 임의의 것이 아닙니다 .)
Erwin Brandstetter

12

데이터의 유효성을 확인하기 위해 길이 제한을 일종의 검사 제한 조건으로 보는 경우 예를 추가하십시오. 사실 당신은 할 수 있습니다 하지 만드는 대신 길이를 정의하지만, 실제 점검 제한 조건을 사용하여 변화하는 속도 한계를.

길이 제한을 변경 (증가)하려면 ALTER TABLE배타적 테이블 잠금이 필요한 동안 (테이블을 다시 쓸 수 있기 때문에) 완료하는 데 시간이 오래 걸릴 수있는 을 실행해야 합니다.

점검 제한 조건 변경 (즉, 삭제 및 재 작성)은 매우 간단한 조작이며 테이블의 데이터를 읽기만하면 행이 변경되지 않습니다. 그래서 그것은 훨씬 빨라질 것입니다 (따라서 독점 테이블 잠금은 훨씬 더 짧은 시간 동안 유지됩니다).

작동 중에는 text, a varchar또는 열간에 차이가 없습니다 varchar(5000).


호기심을 가지고 데이터를 캡처하는 동안 클라이언트 응용 프로그램에서이 길이 검사를 수행 할 수 없다고 생각하는 이유는 무엇입니까?
PirateApp

4
@PirateApp : 종종 하나 이상의 애플리케이션 또는 일부 외부 데이터 소스가 있기 때문에 (매일 배치 가져 오기를 생각하십시오). 그리고 거의 항상 데이터베이스 (및 데이터)가 하나의 응용 프로그램보다 오래 작동합니다.
a_horse_with_no_name 12

2

문제는 VARCHAR 열에 임의의 길이 제한을 추가 하는지 여부입니다 .

그것에 대한 답은 단순히 "아니오"입니다. 와 같은 varchar(max)규칙 을 지원 하거나 사용 하는 열등한 데이터베이스에서와 같이 임의의 제한을 추가하는 것을 정당화 할 수있는 것은 없습니다 varchar(255). 그러나 사양이 한계를 해결하면 특히 최신 버전의 PostgreSQL에서 대답이 훨씬 더 복잡해집니다. 그리고 그것을 위해, 나는 YES 쪽으로 기댈 것 입니다.

내 의견으로는, 사양이 요구하는 경우 한계는 현명한 선택입니다. 특히보다 합리적인 워크로드에 적합합니다. 다른 이유가 없다면 메타 데이터를 보존해야합니다.

내 대답에서 메타 데이터의 가치를 다루는 CHAR vs VARCHAR (Postgres)에 대한 인덱스 성능 .

의미있는 가변 길이 텍스트 키가 있고 최대 길이가 일정하다고 신뢰하는 사양을 발견하면 사용 varchar합니다. 그러나 그 기준에 맞는 것을 생각할 수 없습니다.


1

VARCHAR"매우 긴 문자열은 시스템에 의해 자동으로 압축되고"매우 긴 값은 배경 테이블에 저장되기 때문에 매우 큰 문자열을 저장하는 데 정기적으로 사용하는 경우 약간의 성능 차이가있을 수 있습니다 . 이론적으로 이것은 매우 긴 문자열 필드에 대한 많은 양의 요청이 짧은 문자열 필드보다 느리다는 것을 의미합니다. 이름과 주소가 그리 길지 않기 때문에 아마도이 문제에 빠지지 않을 것입니다.

그러나 데이터베이스 외부에서 이러한 문자열을 사용하는 방법에 따라 시스템 남용을 방지하기위한 실질적인 제한을 추가 할 수 있습니다. 예를 들어, 이름과 주소를 어딘가에 양식에 표시하는 경우 "이름"필드에 전체 텍스트 단락을 표시하지 못할 수 있으므로 이름 열을 500과 같은 것으로 제한하는 것이 좋습니다. 문자.


1
AFAIK TOASTing varchar 및 text 필드에는 차이가 없습니다.
dezso

VARCHARTEXTPostgres에서 순전히 구문 설탕 이며 저장 처리에는 차이가 없습니다. 언급 한 압축 대 배경 테이블 스토리지는 열 메타 데이터가 아닌 열의 실제 데이터 길이를 기반으로 수행됩니다. TEXT 열은 내부적으로 varlenaC 구조체 (생성 / 업데이트시 길이를 저장하는 첫 4 바이트를 갖는 가변 길이 배열)로 저장되며 길이에 따라 최적화되는 구조체입니다.
cowbert
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.