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

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

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

편집 : 속지 않습니다 :

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



답변

대답은 ‘ 아니요’ 입니다. 피할 수있는 경우
길이 수정자를 추가하지 마십시오 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열의 길이 제한 조건을 늘리려면
여전히 테이블을 다시 작성해야합니다.


답변

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

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

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

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


답변

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

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

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

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

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


답변

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

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