database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 20657 게시물 읽기
No. 20657
[질문] 제약조건(primary key) 생성시 성능에 관한 질문입니다.
작성자
작성일
2004-11-09 17:20
조회수
5,089

primary key 생성시 각 자료형에 따른 성능이 차이가 나나요?

음.. 그러니깐 integer나 char(8) number(8),varchar(8) 이렇게 다른 타입에 똑같이 제약조건을 걸면

어느쪽이 가장 속도면에서 좋은결과가 나오나요? 이에 관한 문서라도 있음 가르쳐주세요..

같이 일하시는 분이 프로젝트 중간에 감리시 primary key에 char를 넣지 않으면 지적사항이 될수 있다고 하셔서요..

머 다 char로 할순 없겠지만요...

암튼 답변좀 부탁드립니다.

이 글에 대한 댓글이 총 4건 있습니다.

오라클의 경우 varchar2를 권고 합니다. 거의 모든면에서 varchar2가  char보다 낫습니다.

 

이론을 자세히 알고 싶으시면 ASKTOM칼럼을 참고 바랍니다.

 

char는 varchar2에서 최대길이까지 공백으로 채워진 것과 마찬가지이기 때문에 성능상에 잇점은 없고 공간만 소모할 뿐입니다.

 

또한 PK면 다른 테이블에서 FK로 참조할텐데... 조인시 비교를 할 경우... char형의 경우 스페이스로 인해서 추가적인 오버헤드가 발생하며, 경우에 따라서 공백을 padding하여야 할 필요도 있습니다.

이 경우 연결고리 칼럼을 함수로 가공한 꼴이 되어서 조인의 방향을 그릇되게하여 성능에 악영향을 줄 수 있습니다.

 

따라서 오라클에서는 문자형은 모두 varchar2로 통일하시는게 좋을 듯 합니다.

 

http://asktom.oracle.com/pls/ask/f?p=4950:8:13650498546907098609::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:404640535234,
 
http://asktom.oracle.com/pls/ask/f?p=4950:8:13650498546907098609::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:1542606219593,

김주현님이 2004-11-09 17:51에 작성한 댓글입니다. Edit

답변 감사합니다~

좋은 밤 되세요~

영님이 2004-11-09 18:31에 작성한 댓글입니다.
이 댓글은 2004-11-10 15:28에 마지막으로 수정되었습니다. Edit

 

제가 한번 테스트를 해보았습니다.

그런데 김주현님의 결과와는 다른 내용이 나오는데

어떻게 생각하시는지 궁금하네요..

 

---

 

SQL> drop table temp
  2  /

Table dropped.

SQL>  create table temp(id char(10) primary key, pid char(10) references temp(id))
  2  /

Table created.

SQL> create index temp_pid_idx on temp(pid)
  2  /

Index created.

SQL> insert into temp values(0, null);

1 row created.

SQL> begin
  2  for i in 1..10
  3  loop
  4    insert into temp(id, pid) values(i, 0);
  5  end loop;
  6  end;
  7  /

PL/SQL procedure successfully completed.

SQL> commit;

Commit complete.

SQL> set autot on exp
SQL> select * from temp
  2  start with id='10'
  3  connect by prior id=pid;

ID         PID
---------- ----------
10         0


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=1 Card=1 Bytes=2
          4)

   1    0   CONNECT BY
   2    1     INDEX (UNIQUE SCAN) OF 'SYS_C00947' (UNIQUE) (Cost=1 Car
          d=1 Bytes=12)

   3    1     TABLE ACCESS (BY USER ROWID) OF 'TEMP'
   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'TEMP' (Cost=1 Card=1 B
          ytes=24)

   5    4       INDEX (RANGE SCAN) OF 'TEMP_PID_IDX' (NON-UNIQUE) (Cos
          t=1 Card=1)




SQL>

보다시피 질의에서 '10' 이라고 주어서 2자로 입력이 들어갔지만
start with id='10' 에서 id 쪽을 수정하는게 아니라서 아무런
문제가 없습니다..

그러니까 문제가 발생하려면 아마도
부모테이블이 char이고, 자식 테이블은 이걸 varchar2로 참조한다던가하는 경우가 아니면 불가능할 것으로 생각합니다.

서민구(4baf)님이 2004-11-10 18:56에 작성한 댓글입니다.

서민구님 물론  똑 같은 자료형에 똑 같은 길이면 문제가 되지 않습니다. 하지만 실재로 현업에서 그렇게 되지가 않으니 문제지요. ^^

 

예를 들어char(10)인 ID의 길이를 char(20)으로 늘리기로 결정해서 Parent쪽의 길이는 늘려줬는데 Child쪽은 깜빡잊고 그대로 두었다면?

그러면 개발자들은 그런 상황을 해결하기 위해 rpad를 써서 공백을 채워넣거나할겁니다.

 

실재로 개발자들이 char형에 추가되는 space때문에 trim이나 rpad를 쓰는 경우를 비일비재하게 봅니다.

예를 들어...

 select * from emp where rtrim(ename) = '홍길동';

그런데 위와 같이 좌변을 함수로 가공하면 색인을 못타죠.

그래서 아래와 같이 고쳐써야 합니다.

select * from emp where ename = rpad(:vname, 10)

 

그런데 어느날 ename컬럼의 길이를 char(12)로 늘려버리면?

그러면 위의 쿼리도 수정되어야 정상 작동이 됩니다.

select * from emp where ename = rpad(:vname, 12)

 

마지막으로 연결고리 한쪽은 char이고 부모쪽은 varchar2인 경우 생각보다 사이트 나가보면 많이 발생합니다. 이건에 대해서는 튜닝시 골치아픈 경험 하나씩 있을겁니다.

 

그래서 varchar2를 권고 하고 있습니다.

김주현님이 2004-11-11 10:56에 작성한 댓글입니다.
이 댓글은 2004-11-11 10:57에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
20660오라클 10g 에서 테이블 생성에러 (제약조건에서 에러) [1]
이형문
2004-11-09
2078
20659쿼리 좀 부탁드립니다. [1]
hardline
2004-11-09
1318
20658컬럼의 길이와 타입형식 수정을 어떻게 해야되나요? [4]
왕초보
2004-11-09
2415
20657[질문] 제약조건(primary key) 생성시 성능에 관한 질문입니다. [4]
2004-11-09
5089
20656ORA-00064 에러.. 뭐가 크다고 하는데.....
이덕희
2004-11-09
1522
20655초보에게는 넘 어렵슴다..고수님들 도와 주세요.. [2]
김상우
2004-11-09
1432
20654toad 설치문제 [1]
곽상현
2004-11-09
2020
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.028초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다