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
운영게시판
최근게시물
MS-SQL Q&A 6336 게시물 읽기
No. 6336
MSSQL inDex
작성자
박해일
작성일
2012-03-02 11:50ⓒ
2012-03-02 11:51ⓜ
조회수
7,421

쿼리문을 작성하다 보면

where 절에 Or 문이 들어간 경우에는 한 테이블에 index를 두개를 동시에 타는 경우를 보게 됩니다.

그런데 index를 타지 못하는 경우가 있습니다. 만약 하나의 index만을 타야 한다면 With(index) 를 이용하여 index를 잡는데

처음에 이야기한 or 절에서 두개의 index를 동시에 타게 하려면 어떻게 해야하나요?

 

※ 실행계획에서 보는 index 타는 예

   ...  ── concatenation ──┌──  table(index)

                                            └── table(index)

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

 concatenation은 보통 union all 로 두 개의 결과 집합을 합칠때 나오는 연산자인데요,

 

 

예제를 만들어 보자면
 
 
 
create table #aaa(
aa int
, bb int
, constraint ixa primary key ( aa  )
);
 
create index ixb on #aaa( bb );
 
declare @ii int = 1;
while( @ii < 100 )
begin
insert into #aaa ( aa, bb )
values( @ii, 1050-@ii );
set @ii = @ii + 1;
end
 
select aa, bb from #aaa with( index( ixa ) )  where aa < 10 
union all
select aa, bb from #aaa with( index( ixb ) ) where bb >1030;
 
 
drop table #aaa;
 
물론 위의 예제에서는 강제로 index를 태우지 않아도 스스로 알아서 index를 사용합니다만
뭐 강제로 태우기 위해서는 위와 같이 with로 index를 타도록 할 수 있습니다.
 
 
 
질문하신 의도를 정확히 모르겠어서 첨언을 붙이자면
 
위의 예제에서 
select aa, bb from #aaa with( index( ixa, ixb ) )  where aa < 10 
로 하게 되면 성능은 훨씬 나빠지면서도 강제로 2개를 태울 수는 있긴 합니다만 그렇게 할 이유는 없을거 같으니... ㅋ

 

우욱님이 2012-03-02 14:04에 작성한 댓글입니다. Edit

답변 감사합니다. 잘 이해가 됬습니다.

index 테이블이 깨지거나 DB가 이상하면 가끔 index를 못타고 엉뚱하게 잡아버리는 경우가 있어서 그것을 방지하고자 index를 강제로 줄려고 했던 것입니다. 그런데 Where 에 or 연산자가 있을때는 실제 DB는 Union과 비슷한 인덱스 처리를 한다는 것이네요.

감사합니다.

박해일님이 2012-03-02 15:14에 작성한 댓글입니다. Edit

 으음..

select cols from tbl where col1 = 'Val1' OR col2 = 'val2'

식인 쿼리라면

union과 같은 방식으로는 처리하지 않습니다.

두 개의 컬럼이 모두 하나의 index에 포함되는 복합인덱스가 있다면 해당 인덱스로...

그렇지 않고 각각의 컬럼에 인덱스가 있다면 통계에 근거하여 좀 더 적은 컬럼을 기준으로 나머지 컬럼이 filter 역할을...

둘 중 하나에만 인덱스가 있다면 인덱스가 있는 컬럼을 기준으로 나머지 컬럼을 filter조건으로 사용하게 됩니다.

물론 주어진 조건으로 미루어 보아 전체적으로 검색을 해야할 범위가 너무 크다면 그냥 full scan을 할 수도 있긴 하겠지만 컬럼이 2개라고 union연산이 일어나는 경우는 없는 것으로 알고 있습니다.

 

저 위에 제가 예를 든 경우에서 union all 이 아니라 union이 되면 merge가 일어날 겁니다. (안해보고 쓴 부분이라 확신은 안 서는. -_-;; )

 

우욱님이 2012-03-02 16:05에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6339r2 버젼 [1]
mssql
2012-03-08
6649
6338고수님들 도와주세요ㅜ [1]
나야
2012-03-08
7364
6337mssql linked server mysql 연결시 trigger 오류발생 [2]
문성주
2012-03-06
15841
6336MSSQL inDex [3]
박해일
2012-03-02
7421
6335이런경우 SQL문장 어떻게 만드나요 [1]
김길동
2012-03-02
6990
6334스토어드 프로시져 관련 질문입니다. [2]
조동건
2012-02-29
7706
6331시험문제 데이터베이스 & 앱 [3]
우세연
2012-02-24
6649
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다