2012-09-03 3 views
0

SQLSERVER 2008에서 쿼리를 실행하고 있습니다. 쿼리를 처리하는 데 4 초가 걸립니다. 너무 오래 걸리는 이유를 이해할 수 없습니다.where 절에 SQL 성능 문제가 있습니다.

SELECT tbl_Operations.Workcenter 
,SUM(tbl_Used_Components.Used_Quantity) as CNF_TODAY 
FROM tbl_Used_Components 
JOIN tbl_Pack_Division on tbl_Pack_Division.Pack_Division_ID =   
tbl_Used_Components.Pack_Division_ID 
JOIN tbl_Operations on tbl_Operations.Operation_ID = tbl_Pack_Division.Operation_ID 

where CONVERT(date, tbl_Pack_Division.Stop_Time) = CONVERT(date, getdate()) 
AND tbl_Pack_Division.Memo = 'NORMAL' 
and tbl_Pack_Division.Status = 'CNF_MACH' 
GROUP BY tbl_Operations.Workcenter 

문제는 where 절에 있습니다. Where 절없이 쿼리를 실행하면 0.1 초 후에 실행됩니다. 처음 2 개의 인수를 추가하면 여전히 잘 실행됩니다. 그러나 Status-field에 세 번째 인수를 추가하면 잘못됩니다.

어떻게 이것이 문제가 될 수 있습니까? 그것은 seond 하나 (Memo-field)와 같은 세분성에 대한 선택입니다.

편집 :

상태 VARCHAR (10) - 5 개 가지 값

을 가질 수

메모 VARCHAR (150)

만 지수 : Pack_Division_ID는

XML Execution plan

+2

1 : 관련 필드에 대한 테이블 정의를 게시 할 수 있습니까? 2 : 테이블에 색인이 있습니까? –

+2

아마 서버가 두 필드에 대한 북마크 조회보다 스캔이 더 나은 것으로 판단합니다. 실행 계획을 게시하십시오. – GSerg

+1

나는 여러 가지 추측을 할 수 있지만, GSerg는 실행 계획을 게시한다고 말합니다. Explain을 실행하여 쿼리 앞에 접두사를 추가 한 다음 질문에 출력을 추가하십시오. –

답변

0
을 BIGINT

일반적으로 위치에 열을 하나 더 추가하면 그것은 테이블에서 주먹으로 읽어야한다. 따라서 where 조건이 없으면 인덱스 만 사용할 수 있고 더 적게 읽어야하기 때문에 집계 할 행이 더 많더라도 쿼리가 더 빨라질 수 있습니다.

EXECUTION PLAN을 확인하면 그 두 열의 색인을 사용해야한다고 말합니다.

문제가있는 단계는 여기에 있습니다 :

<RelOp AvgRowSize="48" EstimateCPU="0.136774" EstimateIO="1.94831" 
EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" 
LogicalOp="Clustered Index Scan" NodeId="6" Parallel="false" 
PhysicalOp="Clustered Index Scan" EstimatedTotalSubtreeCost="2.08508" 
TableCardinality="124197"> 

<ScalarOperator ScalarString="[MII03].[dbo].[tbl_Pack_Division].[Memo]='NORMAL' 
AND [MII03].[dbo].[tbl_Pack_Division].[Status]='CNF_MACH' 
AND CONVERT(date,[MII03].[dbo].[tbl_Pack_Division]. 
[Stop_Time],0)=CONVERT(date,getdate(),0)"> 

나는이 같은 시간에 세 개의 값을 모두 사용하려고 이후 그래서 대답은, 당신의 열 상태에서 낮은 "선택"을 할 수 있다는 생각이 상태가 더 많은 시간을 피팅하고 처음 두 값을 단순히 나타 내기 때문에 이제는 더 많은 테스트를 의미합니다. 그러나 나는 AND 논리 연산자로 작업하는 옵티마이 저가 (주문을 의미하는 것) 방법을 100 % 확신하지 못했습니다.

관련 문제