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 Tutorials 9414 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 9414
인덱스 분포도에따라 액세스 플랜을 달리하는 SQL문장
작성자
서민구(4baf)
작성일
2002-01-10 15:18
조회수
5,778

만약 웹상에서 특정 텍스트박스를 통해 바인드변수 v1을 입력받는다고 해보죠. 그리고 이 v1을 가지고 검색을 합니다. 따라서 이 v1이 해당되는 id 컬럼에 인덱스를 준다고 해보죠.

그런데 이 id컬럼은 100이란 값이 90%이고 나머지 값들이 10%를 차지한다고 하면, 인덱스 스캔시 100이란 값을 인덱스 스캔하면 퍼포먼스가 나쁩니다. 아시다시피 인덱스는 테이블의 10~15%선에서 스캔해야하며 그것도 매우 절대적 갯수로도 적은수의 row여야만 합니다.

 

왜냐하면 인덱스 스캔은 single block i/o이며 이것은 multi block i/o(DB_MULTIBLOCK_IO_COUNT 에 의해서 결정됨) 에 비해서 훨씬 느리기 때문이죠.

 

이럴때는 나머지 10%를 위해 인덱스를 생성하게 되는거죠. 그리고 90%의 값이 100에 대해서는 풀 테이블 스캔을 하도록 해야합니다.

 

쿼리는 다음과 같이 해야합니다.

 

 

select * from xxx

where :v1 = 100

and id||'' = :v1

union all

select * from xxx

where :v1 <> 100

and id = :v1

 

중간에 ||'' 를 사용하여 좌변을 가공함으로써 인덱스 스캔을 막았습니다. 이 방법외에도 힌트(/*+ FULL(xxx) */)를 주어서 풀 테이블 스캔을 유도하는 방법도 있습니다.

 

보통 문자열은 ||'' 를 해서 인덱스를 죽이고, 숫자는 +0을 합니다. 그러나 힌트가 더 좋은 방법이며 추천되는 방법입니다. 왜냐하면 앞으로 옵티마이저의 성향이 어찌 바뀔지 모르기때문에 가공하는 것만으로는 완벽하지 않기때문이죠.

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

좋은 tip 인 것 같습니다. 별다른 생각없이 사용하던 사람들에게는 아하 이런 방법도 있구나 하는 생각이 들게 하는 방법이로군요. :-)

 

좋은 글 감사 드립니다.

정재익(advance)님이 2002-01-10 15:40에 작성한 댓글입니다.

전 이런 방법보다는 100이란 값을 저장할 때에는 NULL로 저장하도록 정의하는 것이 훨씬 유리하다고 생각합니다. 위와 같은 방법은 union all을 이용하는 단점이 발생하기 때문입니다. 만약 100대신 NULL로 이용하였다면 100을 입력하였을 경우에는 id is null이라고 조건문이 되므로, 이런 경우에는 저절로 index를 경유하지 않게 되는 것으로 알고 있습니다.

신희태님이 2002-05-22 03:14에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
10054libwtc8.so 가 없다고.. 나오는 에러... 해결방법 [1]
우상희
2002-02-28
7229
9754레드햇7.x 혹은 와우7.1 에서의 demo_proc.mk 컴파일 관련 힌트(?) [7]
송호진
2002-02-01
7061
9442Simple Guide : Hierarchical Queries [5]
최공훈
2002-01-11
6504
9414인덱스 분포도에따라 액세스 플랜을 달리하는 SQL문장 [2]
서민구
2002-01-10
5778
9363MANIPULATING LARGE OBJECTS USING DBMS_LOB PACKAGE (2)
정재익
2002-01-07
7873
9362MANIPULATING LARGE OBJECTS USING DBMS_LOB PACKAGE (1)
정재익
2002-01-07
6944
9357RedHat 6.0 에서 PHP3 와 오라클 8.1.5 의 연동
정재익
2002-01-07
4665
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.056초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다