데이터베이스 개발자 질문과 답변 게시판

데이터베이스 개발/운영 관련 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.

안녕하세요. 

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


제목과 같이 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
9502 파워빌더 12.5 문의드려요. [1] 나는야SQL초보 2016.09.07 3419
9501 쿼리 문의, Max 날짜 및 데이타 가져오기 [1] 어둠별빛 2016.09.07 2506
9500 통신 버퍼 리소스에서 다른 프로세스와의 교착 상태가 발생 [1] HSQL 2016.09.06 3332
9499 Unicode .txt 파일 format파일 이용해서 BulkInsert할때 문제점 [1] 띠립수 2016.09.05 2814
9498 xml path 결과 출력 문의 [2] dDrake 2016.09.05 2251
9497 select 결과의 row가 여러개 일 경우 각각의 결과를 변수에 할당 할 수 있나요? [1] 셀프 2016.09.05 2207
9496 재귀쿼리 조직도 쿼리 질문입니다. [1] 아더왕 2016.09.05 2940
9495 숫자 한글 혼합 정렬문제...? [8] 문상연 2016.09.04 3108
9494 group by 질문이 있어요..(쿼리수정 -_-) [2] neiyan 2016.09.02 2379
9493 SSMS 로 인한 CPU 부하 문의 [2] 아스날 2016.09.02 2642
9492 월별 가로 출력 ms-sql 쿼리 질문입니다. [1] 미뇽 2016.09.01 3382
9491 오라클 쿼리를 sql로 변경하려면,, sum over ( order by tt desc) 이부분을 [4] 하늘양 2016.09.01 2185
9490 dat텍스트파일을 열면 글씨가 깨져 나옵니다. 엑셀로 변환 방법과 여는 방법 부탁드립니다. [1] 락규 2016.09.01 5215
9489 select문으로 불러온 칼럼값 문제 [2] 질문쟁이 2016.09.01 1881
9488 서버 이전 후 SSIS 패키지는 모두 재생성을 해야하는 걸까요? [1] 더따뜻한 2016.08.29 2302
» SQL where 조건에 변수입력시 옵티마이저가 비정상적 판단을 합니다. [7] 꼬셔죠 2016.08.29 3020
9486 (SQL2008 R2) 접속 후, 에러문구 문의. [1] 탕슉 2016.08.26 2503
9485 정렬문제..? [8] 문상연 2016.08.24 2643
9484 특정 시간대 데이터를 뽑는 쿼리 도와주세요. [5] hunit 2016.08.23 3457
9483 번호 로그인 관련 문의 드립니다. [2] 남군 2016.08.23 1742





XE Login