안녕하세요. 

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


제목과 같이 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 33594
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 16948
9503 범위에 해당하는 검색 조건 질문입니다. [4] 비폭력무저항 2016.09.07 2186
9502 파워빌더 12.5 문의드려요. [1] 나는야SQL초보 2016.09.07 3568
9501 쿼리 문의, Max 날짜 및 데이타 가져오기 [1] 어둠별빛 2016.09.07 2561
9500 통신 버퍼 리소스에서 다른 프로세스와의 교착 상태가 발생 [1] HSQL 2016.09.06 3664
9499 Unicode .txt 파일 format파일 이용해서 BulkInsert할때 문제점 [1] 띠립수 2016.09.05 3052
9498 xml path 결과 출력 문의 [2] dDrake 2016.09.05 2314
9497 select 결과의 row가 여러개 일 경우 각각의 결과를 변수에 할당 할 수 있나요? [1] 셀프 2016.09.05 2714
9496 재귀쿼리 조직도 쿼리 질문입니다. [1] 아더왕 2016.09.05 3024
9495 숫자 한글 혼합 정렬문제...? [8] 문상연 2016.09.04 3485
9494 group by 질문이 있어요..(쿼리수정 -_-) [2] neiyan 2016.09.02 2432
9493 SSMS 로 인한 CPU 부하 문의 [2] 아스날 2016.09.02 2715
9492 월별 가로 출력 ms-sql 쿼리 질문입니다. [1] 미뇽 2016.09.01 3519
9491 오라클 쿼리를 sql로 변경하려면,, sum over ( order by tt desc) 이부분을 [4] 하늘양 2016.09.01 2234
9490 dat텍스트파일을 열면 글씨가 깨져 나옵니다. 엑셀로 변환 방법과 여는 방법 부탁드립니다. [1] 락규 2016.09.01 6134
9489 select문으로 불러온 칼럼값 문제 [2] 질문쟁이 2016.09.01 1926
9488 서버 이전 후 SSIS 패키지는 모두 재생성을 해야하는 걸까요? [1] 더따뜻한 2016.08.29 2351
» SQL where 조건에 변수입력시 옵티마이저가 비정상적 판단을 합니다. [7] 꼬셔죠 2016.08.29 3359
9486 (SQL2008 R2) 접속 후, 에러문구 문의. [1] 탕슉 2016.08.26 2553
9485 정렬문제..? [8] 문상연 2016.08.24 2683
9484 특정 시간대 데이터를 뽑는 쿼리 도와주세요. [5] hunit 2016.08.23 3683





XE Login