안녕하세요. 

도움을 주시는 많은 고수님들 고맙습니다.


제목과 같이 driving where 조건에 변수값을 입력하면 

적절하지 못한 인덱스를 선택하며, 강제로 인덱스를 할당키 위해 hint를 주면 error를 뱉어내고 있습니다.


SQL Server 2012 Std Edition 64bit


해당 Table(ARSCALL) 구조 설명

CALL_DATE varchar(8) not null -- YYYYMMDD  예) 20160823, 20160729 ..

INDEX

IX#1 CALL_DATE

IX#2 CALL_DATE , SYSNO   filter ( syscode != '00999' )


문제의 쿼리 요약


(Case A : 현재의 고비용 쿼리)


select *  from ARSCALL

where  CALL_DATE = convert(varchar(8),getdate(),112)

and SYSNO in ('1234','5325','4532' )

and syscode != '00999'


결과(Case A)

==>   비효율적인 인덱스 IX#1 을 Optimizer가 선택




(Case B : 인덱스 힌트 추가)


select *  from ARSCALL with( index(IX#2))   <-- 적절한 인덱스 힌트 부여

where  CALL_DATE = convert(varchar(8),getdate(),112)

and SYSNO in ('1234','5325','4532' )

and syscode != '00999'


결과 (Case B)
==> 오류 발생
메시지 8622, 수준 16, 상태 1, 줄 1
이 쿼리에 정의된 힌트로 인해 쿼리 프로세서에서 쿼리계획을 생성할 수 없습니다.
힌트를 지정하거나 SET FORCEPLAN을 사용하지 않고 쿼리를 다시 전송하십시오.
 : SET ForcePlan off 등을 해도 동일한 오류 발생


(Case C : 변수로 지정하여 표현)

declare @cdate varchar(8) = convert(varchar(8),getdate(),112)

select *  from ARSCALL
where CALL_DATE = @cdate
and SYSNO in ('1234','5325','4532' )

and syscode != '00999'


결과( Case C )
==> Case A와 동일하여 비효율적인 index IX#1을 선택


(Case D : 해당 쿼리를 function으로 처리)

Create Function UFN_getARS()
returns table
as 
return (

select *  from ARSCALL

where  CALL_DATE = convert(varchar(8),getdate(),112)

and SYSNO in ('1234','5325','4532' )

and syscode != '00999'


)

결과 (Case D)

==> Case A와 동일

, 위 Function에 힌트지정과 변수 지정을 A,B,C와 같이 지정해봤지만

결과는 A,B,C 조건에 따른 결과와 일치



( Case E : 대입항목에 변수대신 스칼라값을 직접 입력)


select *  from ARSCALL
where  CALL_DATE = '20160823'
and SYSNO in ('1234','5325','4532' )

and syscode != '00999'


결과 (Case E)

==> 정상 Index(IX#2) 선택 및 결과 출력



syscode 항목을 데이타에서 제거하고픈 맘이 굴뚝 같았으나 고객사 DB인지라..



SQL 2008 시절이 이경우 Function 으로 우회 처리하는 방법이 사용되어 

시도해봤으나 위와 같이 결론은 부정적이었습니다.


여러 웹서버의 시간이 동일하다는 가정을 전제하지 못하기에 DB시스템시간을 기준으로

처리하기에 애로사항이 있네요.


어찌됐건 결론은 스칼라값이 driving 조건에 대입된다면 정상적으로 처리되나

변수값이 대입되면 옵티마이저가 비정상적인 선택을 하고 있습니다.


현재의 비정상적인 상황을 어찌 개선할 수 있을런지 고수님들의 도움을 요청합니다.

감사합니다.







No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 19927
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 12111
9498 xml path 결과 출력 문의 [2] dDrake 2016.09.05 2306
9497 select 결과의 row가 여러개 일 경우 각각의 결과를 변수에 할당 할 수 있나요? [1] 셀프 2016.09.05 2699
9496 재귀쿼리 조직도 쿼리 질문입니다. [1] 아더왕 2016.09.05 3017
9495 숫자 한글 혼합 정렬문제...? [8] 문상연 2016.09.04 3472
9494 group by 질문이 있어요..(쿼리수정 -_-) [2] neiyan 2016.09.02 2427
9493 SSMS 로 인한 CPU 부하 문의 [2] 아스날 2016.09.02 2709
9492 월별 가로 출력 ms-sql 쿼리 질문입니다. [1] 미뇽 2016.09.01 3513
9491 오라클 쿼리를 sql로 변경하려면,, sum over ( order by tt desc) 이부분을 [4] 하늘양 2016.09.01 2224
9490 dat텍스트파일을 열면 글씨가 깨져 나옵니다. 엑셀로 변환 방법과 여는 방법 부탁드립니다. [1] 락규 2016.09.01 6085
9489 select문으로 불러온 칼럼값 문제 [2] 질문쟁이 2016.09.01 1921
9488 서버 이전 후 SSIS 패키지는 모두 재생성을 해야하는 걸까요? [1] 더따뜻한 2016.08.29 2344
» SQL where 조건에 변수입력시 옵티마이저가 비정상적 판단을 합니다. [7] 꼬셔죠 2016.08.29 3334
9486 (SQL2008 R2) 접속 후, 에러문구 문의. [1] 탕슉 2016.08.26 2545
9485 정렬문제..? [8] 문상연 2016.08.24 2678
9484 특정 시간대 데이터를 뽑는 쿼리 도와주세요. [5] hunit 2016.08.23 3660
9483 번호 로그인 관련 문의 드립니다. [2] 남군 2016.08.23 1782
9482 SP 를 사용한 월별 테이블 생성 하는 방법 [4] Lauren 2016.08.22 2407
9481 2008 이상에서 시스템 함수 만드는 방법좀? 이나영2 2016.08.22 2749
9480 공유기 밑단에서 Sql서버를 두대이용하고 싶습니다. [1] 영우님 2016.08.19 2479
9479 엑셀파일 업로드하는데 에러가 뜹니다. ㅠㅠ [1] xelloslove 2016.08.19 4696





XE Login