postgresql - plan 질문 ( varchar, text 컬럼 - Index Scan) 0 3 1,687

by 불혹 [DB 모델링/설계] postgresql plan casting [2021.06.01 14:44:46]


 

테이블 생성 데이터 타입(varchar, text)에 대한 고민입니다.

아래 2가지 테스트를 진행했습니다.

    1. varchar 컬럼 생성, 

    2. text 컬럼 생성

    각각 인덱스를 생성하고 plan 확인 내용입니다.

 

    아래 결과만 보았을 때... varchar 컬럼 인덱스 scan시 ::text로 cast하는것으로 보여지는데....

     ==> 테이블 생성 시 컬럼을 varchar보다 text로 선언해야 할까요?

  환경 : PostgreSQL 13.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit

 

 

-----1. varchar 컬럼 생성
create table xx1 (
    col varchar(10)
) ;

-- 인덱스 생성
create index xx1_ix01 on xx1 (col) ;

-- 데이터 추가
insert into xx1(col) values ('a') ;
insert into xx1(col) values ('b') ;
insert into xx1(col) values ('c') ;
insert into xx1(col) values ('d') ;

-- 데이터 조회
select * 
from xx1 
where col = 'a' ;

-- plan 
Node Type	Entity	Cost	Rows	Time	Condition
Bitmap Index Scan	xx1_ix01	0.00 - 4.20	6	[NULL]	((col)::text = 'a'::text)


=> 실행 계획의 "((col)::text = 'a'::text)" 부분은 col에 대한 text casting을 하는 건지 궁금합니다.

 

 

--2. text 컬럼 생성
create table xx2 (
    col text
) ;

--인덱스 생성 
create index xx2_ix01 on xx2 (col) ;

-- 데이터 추가
insert into xx2(col) values ('a') ;
insert into xx2(col) values ('b') ;
insert into xx2(col) values ('c') ;
insert into xx2(col) values ('d') ;

-- 데이터 조회
select * 
from xx2 
where col = 'a' ;

-- plan
Node Type	Entity	Cost	Rows	Time	Condition
Bitmap Index Scan	xx2_ix01	0.00 - 4.21	7	[NULL]	(col = 'a'::text)

=> text 컬럼의 경우 "(col = 'a'::text)"  casting 없는 plan을 보여집니다.

 

by 뉴비디비 [2021.06.01 22:38:28]

PostgreSQL은 VARCHAR(무제한) 와 TEXT 타입이 둘다 성능이 똑같다고 합니다. 
( 원문내용 : https://www.postgresqltutorial.com/postgresql-char-varchar-text/ 
        The performance of the VARCHAR (without the size n) and TEXT are the same.  )

TEXT 타입으로 설정할 수도 있겠지만, 개인적으로는 크기를 좀 여유있게 잡더라도 VARCHAR(제한) 으로 설정하시는게 나을꺼 같아요.


by 불혹 [2021.06.02 14:43:59]

답변 감사합니다.  그렇네요.. varchar, text가 같은 성능이라고 하네요 

 

추가 질문으로 plan부분도 궁금합니다.

 

오늘은 대용량 2천백만 데이터의 PK를  varchar와 text 타입만 변경하여 테스트했는데..

 .성능은 동일하다고 판단됩니다. 인덱스로 잘 활용되고..

그런데... plan에

   varchar 컬럼에 "((col)::text = 'a'::text)" 부분이 궁금합니다.

   text 컬럼  plan은 "(col = 'a'::text)" 이렇게 깔끔(?)하게 나오네요 

 

 

 

 


by 뉴비디비 [2021.06.02 20:58:03]

PostgreSQL 은 data type 말고, type cast 에 
숫자형은 bigint, smallint, numeric, double precision (float) 등이 있는데, 문자형은 text 만 있는거 같아요.
그래서 plan 에서 string을 casting 하는 type이 ::text 로 나오는게 아닐까 싶어요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입