2012-08-22 1 views
1

실패 :Sybase 뷰 쿼리 값 작동하지만 변수를 하드 코딩이가에서 약 1 초간 작동하는 사람이 왜 알고 있나요

select Q.USR_LOAD_NBR from QUAD0066..QTS_LOAD_INFO Q where Q.KY_TO_STP = 2142870 

하지만이 10 개 이상의 초 소요 (최대 5 분) :

declare @groupId int 
set @groupId = 2142870 
select Q.USR_LOAD_NBR from QUAD0066..QTS_LOAD_INFO Q where Q.KY_TO_STP = @groupId 

ibatis가 15 초 내에 시간 초과되어 내 코드가 실패하는 것을 제외하고이 쿼리에서 ibatis와 똑같은 문제가 발생했습니다. (하드 코드 된 1 초 미만, int 매개 변수로 시간 제한)

답변

0

값을 하드 코딩하면 쿼리 최적화 프로그램에서 가능한 최상의 계획을 선택할 수 있습니다. 쿼리 최적화 프로그램은 값이 무엇인지 모르기 때문에 값이 변수 인 경우에는 이러한 일이 발생하지 않습니다.

지금 당신이 할 수있는 일은 prolly 당신이 클러스터되지 않은 수의 KY_TO_STP 열에 대한 인덱스를 만들 수 있습니다 :

create nonclustered index on QTS_LOAD_INFO(KY_TO_STP) 

당신이 고유하게 KY_TO_STP의 모든 값을 원하는 경우 unique을 추가 할 수 있으며이 nonclustered를 대체 할 수 KY_TO_STP이 기본 키이거나 각 행을 고유하게 식별 할 수 있으면 (테이블 당 하나의 클러스터 된 인덱스 만 가질 수 있음을 잊지 말아야 함) clustered으로 변경하십시오.

+0

의미가 있습니다 ... 텍스트 대체가 발생한다고 생각했지만 검색어가 변수를 보내고 있다고 말하는 것입니까? – anthonybell

0

오류가 있습니까? 다른 프로그램 (예 : ase isql 및 대화식 sql)을 사용하여이 코드를 실행 했습니까?

+0

저는 qwerybuilder를 사용하고 있습니다. 나는 또한 C# 프로젝트에서 ibatis를 사용하고있다. – anthonybell

+0

대화 형 sql (sybase 중앙에 있음)을 사용하여 실행 해보십시오. 코드가 맞는지 확인하십시오. 아마도 포맷팅에 문제가있을 수 있습니다 : 하나 이상의 공간 또는 잘못된 라인 끝. 나는 가끔 제대로 입력하지 않고 입력 문제가 발생했습니다. 나는 ibatis를 모른다. 그래서 나는 너를 도울 수 없다. – Parado

+0

@ParadoX 귀하가 진술 한 내용은 해결책이 아니므로 의견을 들어야합니다. –