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 3540 게시물 읽기
No. 3540
어느것이 성능에 더 좋을까요 ?
작성자
김영수(io2tree)
작성일
2007-05-31 18:35
조회수
3,046


char(1)으로 만들어진 isOpen이라는 컬럼이 있습니다.


[ContentID] [int] IDENTITY(1,1) PK

[IsOpen] [char] (1) not null default('Y')



단순히 공개 비공개를 나타내는 필드로 값은 Y,N 만 들어 갑니다.

이 필드를 포함한 테이블의 데이터 건수는 하루에 3천개 정도 쌓이 것으로 예상하며, 인서트와 셀렉트가 상당히 많이 일어 납니다.


데이터 조회시에...

select * from tblTable where isOpen='Y' 이렇게 뽑는게 빠를지... // IsOpen에는 NonClustered Index를 걸어준 상태구요...



아니면... tblOpenIndex 라는 이름으로 isOpen이 Y로 설정된 값이 들어있는 테이블을 만들어 인덱스를 걸어 뽑는것이 빠를지..


[tblOpenIndex]

[ContentID] [int] PK -- CLUSTERED INDEX 구성



select * from tblTable where ContentID IN (select ContentID from tblOpenIndex) 이런식의 쿼리.. 중 어느게 빠른가요 ???


---------------------------------------------------------------------------------------------------------------------


보통 not in 쿼리가 느리다고 하시던데... 그렇다면 IN 쿼리는 속도가 어떤가요 ?

NOT IN과 IN을 상당히 많이 사용 할 것으로 생각이 되는데.. 둘다 속도가 별로라면.. 설계를 바꿔야 해서.. ㅜㅜ


고수님들의 조언 부탁드립니다.

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

먼저 y,n 이라는 두 값만을 가져오기 위한 조건은 데이터 처리 범위가 너무 넓어 지기 때문에
인덱스는 큰 효용이 없을 것으로 판단됩니다. 
즉 noclustered index 를 만들게 되면..bookmark lookup이 발생하여, 클러스터드 인덱스를 
한번 더 찾아야 하는 pointer jump 현상이 발생하여, 오히려 full scan 보다도 더 
비 효율적이라고 판단됩니다. 
차라리 clustered index 를 생성하는 것이 낫습니다. 

in 조건은 선분단위 검색이 아닌 점 단위의 검색을 수행하므로 = 조건으로 검색하는 것과
비슷한 효과를 냅니다. 
하지만 in 조건을 사용시, 검색 범위가 적은 소량의 컬럼을 주로 검색 조건으로 가져 가는
것이 좋습니다. 
그리고 in 앞에 조건이 되는 컬럼에는 반드시 인덱스가 있어야 하며, 
in (select ~) 라면..in 조건 안의 select 구문의 성능도 신경을 많이 써야 성능을 보장 받을수 있습니다. 

not in 의 경우 부정형이기 때문에.. 조건이 되는 앞 컬럼에 아무리 인덱스를 줘 봐야
인덱스를 탈수 없습니다. 
조건에 따라서 차라리 exist 문을 사용하는 것을 권장합니다. 
물론 not in이 모든 경우에 않좋은건 아니지만... not in ~ 이후의 처리 범위가 넓은 쿼리나
조건이 온다면..치명타가 될 것입니다. 

수고하세요..

나그네님이 2007-06-01 09:02에 작성한 댓글입니다. Edit

답변 정말 감사합니다.
정말로 큰 부분을 배웠습니다.
궁금했던 부분을 박박 긁어 주셔서.. 오랜만에 속이 시원했습니다.

한가지만 더 여쭤 보겠습니다.

not in ~ 이후의 처리 범위가 넓은 쿼리 또는 조건이라는 말씀이 좀 이해가 되지 않습니다.

조건이라는 말은 Where절에 들어가는 부분으로 이해가 되는데...
넓다는 뜻은 데이터량을 말씀하시는 건가요 ?? 


제가 워낙 초보라 ㅜㅜ

김영수(io2tree)님이 2007-06-01 10:03에 작성한 댓글입니다.
이 댓글은 2007-06-01 10:33에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
3543좀 도와주십시오.. [2]
왕초보
2007-06-01
3681
3542access(mdb)에서 null처리 문제(.net 2.0)? [1]
지화복
2007-06-01
3476
3541Datetime과 SmallDatetime의 차이 ? [2]
김영수
2007-06-01
7290
3540어느것이 성능에 더 좋을까요 ? [2]
김영수
2007-05-31
3046
3539update시 order by 오류 [3]
푸롬이
2007-05-31
4551
3538left join일때 sum처리
풍뎅이
2007-05-31
2969
3537MSSQL 리눅스에서 C++로 연결하기 도와주세요...
오찌
2007-05-31
3417
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다