Programing

PostgreSQL : 텍스트와 varchar의 차이 (문자 변경)

lottogame 2020. 2. 9. 20:27
반응형

PostgreSQL : 텍스트와 varchar의 차이 (문자 변경)


text데이터 유형과 character varying( varchar) 데이터 유형 의 차이점은 무엇입니까 ?

설명서 에 따르면

문자 지정이 길이 지정자없이 사용되는 경우 유형은 모든 크기의 문자열을 허용합니다. 후자는 PostgreSQL 확장입니다.

또한 PostgreSQL은 모든 길이의 문자열을 저장하는 텍스트 유형을 제공합니다. 유형 텍스트는 SQL 표준이 아니지만 다른 여러 SQL 데이터베이스 관리 시스템에도 있습니다.

차이점은 무엇입니까?


차이점은 없습니다. 두건에서 모두입니다 varlena( 가변 길이 배열 ).

Depesz에서이 기사를 확인하십시오 : http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/

몇 가지 주요 사항 :

요약하면 다음과 같습니다.

  • char (n) –보다 짧은 값을 처리 할 때 공간을 너무 많이 차지하고 n( 값을 채 n웁니다) 후행 공백을 추가하여 미묘한 오류가 발생할 수 있으며 한계를 변경하는 데 문제가 있습니다
  • varchar (n) – 실제 환경에서 제한을 변경하는 데 문제가 있습니다 (테이블을 변경하는 동안 독점 잠금이 필요함)
  • varchar – 텍스트처럼
  • text – 나에게는 승자 – 데이터 유형이 문제가 없기 때문에 (n) 이상, varchar 이상 – 별개의 이름이 있기 때문에

이 기사에서는 4 가지 데이터 유형 모두에 대한 인서트 및 선택의 성능이 유사하다는 것을 보여주기 위해 자세한 테스트를 수행합니다. 또한 필요할 때 길이를 제한하는 다른 방법을 자세히 살펴 봅니다. 함수 기반 제약 조건 또는 도메인은 길이 제약 조건을 즉시 증가시킬 수 있다는 장점을 제공하며 문자열 길이 제약 조건을 줄이는 것이 드물다는 점을 고려할 때 depesz는 일반적으로 길이 제한에 대한 최선의 선택이라고 결론을 내립니다.


"와 같은 문자 유형 의 문서 점에서"밖으로 varchar(n), char(n)그리고 text모두 같은 방식으로 저장됩니다. 유일한 차이점은 길이가 주어진 경우 길이를 확인하기 위해 추가 사이클이 필요하고 패딩이 필요한 경우 추가 공간과 시간이 필요하다는 것입니다 char(n).

그러나 단일 문자 만 저장해야하는 경우 특수 유형을 사용하면 약간의 성능 이점이 있습니다 "char"(큰 따옴표는 유형 이름의 일부입니다). 필드에 더 빠르게 액세스 할 수 있으며 길이를 저장하는 오버 헤드가 없습니다.

방금 "char"소문자 알파벳에서 선택한 1,000,000 개의 무작위 테이블을 만들었습니다 . 주파수 분포 ( select count(*), field ... group by field) 를 얻는 쿼리 text필드를 사용하는 동일한 데이터에서 약 760 밀리 초가 걸리는 데 약 650 밀리 초가 걸립니다 .


2016 년 벤치 마크 업데이트 (pg9.5 이상)

"Pure SQL"벤치 마크 사용 (외부 스크립트없이)

  1. UTF8과 함께 string_generator를 사용하십시오.

  2. 주요 벤치 마크 :

    2.1. 끼워 넣다

    2.2. 비교 및 계산 선택


CREATE FUNCTION string_generator(int DEFAULT 20,int DEFAULT 10) RETURNS text AS $f$
  SELECT array_to_string( array_agg(
    substring(md5(random()::text),1,$1)||chr( 9824 + (random()*10)::int )
  ), ' ' ) as s
  FROM generate_series(1, $2) i(x);
$f$ LANGUAGE SQL IMMUTABLE;

특정 시험 준비 (예)

DROP TABLE IF EXISTS test;
-- CREATE TABLE test ( f varchar(500));
-- CREATE TABLE test ( f text); 
CREATE TABLE test ( f text  CHECK(char_length(f)<=500) );

기본 테스트를 수행하십시오.

INSERT INTO test  
   SELECT string_generator(20+(random()*(i%11))::int)
   FROM generate_series(1, 99000) t(i);

그리고 다른 테스트들

CREATE INDEX q on test (f);

SELECT count(*) FROM (
  SELECT substring(f,1,1) || f FROM test WHERE f<'a0' ORDER BY 1 LIMIT 80000
) t;

... 그리고 사용하십시오 EXPLAIN ANALYZE.

다시 업데이트 2018 (pg10)

2018 년 결과를 추가하고 권장 사항을 강화하기 위해 약간의 편집.


2016 년 및 2018 년 결과

평균적으로 많은 기계와 많은 테스트에서 내 결과는 모두 동일합니다
(통계적으로 적은 표준 편차).

추천

  • 사용 text, 데이터 유형을
    세 않도록 varchar(x)때때로 표준, 예를 들어 있지 않기 때문에 CREATE FUNCTIONvarchar(x)varchar(y) .

  • (같은과 한계를 표현 varchar성능!)에 의해 CHECK에 절 CREATE TABLE
    예를 CHECK(char_length(x)<=10).
    당신은 또한 할 수있는 제어 범위와 문자열 구조에 INSERT / UPDATE의 성능을 무시할 손실
    CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')


PostgreSQL 매뉴얼

공백으로 채워진 유형을 사용할 때 스토리지 공간이 증가하고 길이가 제한된 컬럼에 저장할 때 길이를 확인하기 위해 몇 가지 추가 CPU주기 외에는이 세 가지 유형간에 성능 차이가 없습니다. character (n)은 일부 다른 데이터베이스 시스템에서 성능 이점이 있지만 PostgreSQL에서는 그러한 이점이 없습니다. 실제로 character (n)은 추가 스토리지 비용으로 인해 일반적으로 3 개 중 가장 느립니다. 대부분의 상황에서 텍스트 나 문자를 다양하게 사용해야합니다.

나는 보통 텍스트를 사용한다

참조 : http://www.postgresql.org/docs/current/static/datatype-character.html


제 생각 varchar(n)에는 자체 장점이 있습니다. 예, 그들은 모두 동일한 기본 유형을 사용합니다. 그러나 PostgreSQL의 인덱스 는 행 당 2712 바이트 의 크기 제한이 있음을 지적해야합니다 .

TL; DR : 제약 조건없이text 유형 을 사용 하고 이러한 열에 색인이있는 경우 일부 열에 대해이 한계에 도달하고 데이터를 삽입하려고 할 때 오류가 발생하지만을 사용 하면이를 방지 할 수 있습니다.varchar(n)

좀 더 자세한 사항 : 여기서 문제가에 대한 인덱스를 만들 때 PostgreSQL을 어떤 예외를 포기하지 않는다는 것입니다 text유형 또는 varchar(n)경우는 n2712보다 큰의 압축 된 크기의 레코드를 삽입하려고 할 때이 오류를 줄 것이다, 그러나보다 큰 2712입니다. 이는 2712 이하로 압축되기 때문에 반복 문자로 쉽게 구성된 100.000 문자의 문자열을 삽입 할 수 있지만 압축 된 크기가 2712 바이트보다 크기 때문에 4000 문자로 일부 문자열을 삽입하지 못할 수 있습니다. 사용하는 varchar(n)n없는 너무 많은 2,712 이상, 당신은 이러한 오류로부터 안전 해요.


text와 varchar는 암시 적 유형 변환이 다릅니다. 내가 주목 한 가장 큰 영향은 후행 공백을 처리하는 것입니다. 예를 들어 ...

select ' '::char = ' '::varchar, ' '::char = ' '::text, ' '::varchar = ' '::text

예상대로 반환 true, false, true하지 않습니다 true, true, true.


다소 OT : Rails를 사용하는 경우 웹 페이지의 표준 형식이 다를 수 있습니다. 데이터 입력 양식의 경우 text상자를 스크롤 할 수 있지만 character varying(레일 string) 상자는 한 줄입니다. 보기 조회수는 필요한 시간입니다.


character varying(n), varchar(n)-(모두 동일). 오류가 발생하지 않고 값이 n 자로 잘립니다.

character(n), char(n)-(모두 동일). 고정 길이이며 길이가 끝날 때까지 공백으로 채 웁니다.

text-무제한 길이.

예:

Table test:
   a character(7)
   b varchar(7)

insert "ok    " to a
insert "ok    " to b

결과를 얻습니다.

a        | (a)char_length | b     | (b)char_length
----------+----------------+-------+----------------
"ok     "| 7              | "ok"  | 2

참고 URL : https://stackoverflow.com/questions/4848964/postgresql-difference-between-text-and-varchar-character-varying



반응형