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 6794 게시물 읽기
No. 6794
정적쿼리 질문 또한가지
작성자
상도동
작성일
2014-03-17 17:43ⓒ
2014-03-17 17:45ⓜ
조회수
8,120

아 고수님들 계실때 빨리 질문올립니다.

제가 정적쿼리를 구현할때 다음의 문장을 많이 씁니다.

 

WHERE (col = @a OR '' = @a)

 

위의 조건절에서 @a 가 빈값일때 모든 값을 쿼리해오는데요

col 이 인덱스컬럼일 경우 성능에 큰 영향을 미치리라 보시나요?

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

짐작하신대로 인덱스를 타느냐 못 타느냐로 인해서 당연히 영향이 큽니다.....만

 

Stored Procedure인 경우 부적절한 실행 계획을 사용하는 "큰 함정"을 만들어 낼 수 있게 됩니다.

즉, SP가 처음 실행될때 @a의 값이 빈 값이면 인덱스를 사용하지 않는 실행 계획이 만들어지고 이 실행 계획이 캐쉬됩니다.

그 후에 @a의 값이 빈 값이 아닌 값이 주어졌을때도 인덱스를 사용하지 않는 실행 계획대로 실행됩니다.

물론 이와 반대되는 경우도 발생할 수 있습니다.

 

그래서 저의 경우에는 이렇게 합니다.

  • 저런 @a와 같은 조건이 3개 이내인 경우에는 WHERE col=@a 인 SP와 @a를 검색조건에 참여하지 않는 SP를 별도로 각각 만듭니다. 그래서 저런 식의 조건이 3개면 총 8개의 SP를 생성합니다.
  • 저런 조건이 4개 이상인 경우에는 쿼리힌트로 recompile을 줍니다. 즉 쿼리문의 끝에 OPTION( RECOMPILE )이 붙이면 SP가 실행될때마다 실행계획을 새롭게 만듭니다. 이때 프로시저 옵션으로 recompile하면 약발이 먹지 않습니다.
  • 인자가 4개 이상이 되더라도 정형화된 검색 즉, 1000번 수행되면 @a의 값이 995번은 주어지고 5번 정도 주어지지 않고 5번에 해당하는 결과가 늦어도 크게 문제되지 않는 경우라면 대부분 수행되는 경우에 맞추어 어떤 인덱스를 사용할지를 힌트로 기술해버립니다.

 

우욱님이 2014-03-18 09:26에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6797다수 업체의 동일 시간대 소비량 구하기 [2]
궁금이
2014-03-20
8286
6796SQL SERVER 2012 64bit Ent 메모리 엄청나군요 [2]
조중규
2014-03-18
8925
6795디비소유자 [1]
상도동
2014-03-17
8017
6794정적쿼리 질문 또한가지 [1]
상도동
2014-03-17
8120
6793동적정적쿼리 병행사용 [2]
상도동
2014-03-17
8555
6792날짜 출력에 관하여 질문 드려용 [1]
이성원
2014-03-13
8325
6791mssql 에서 채번? PK코드 값을 자동으로 넣고 싶습니다. [4]
풀잎
2014-03-12
12687
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다