2014-12-08 2 views
0

내가 SQL의이 비트를 결합UPDATE 성능

DECLARE @tmpTable TABLE(idTransaction int PRIMARY KEY, Value money) 
DECLARE @idStatement int = 0 

UPDATE T 
     SET idStatement = @idStatement 
FROM tbl_Transaction T 
INNER JOIN @tmpTable ST on T.id = ST.idTransaction 

테이블 tbl_Transaction는 (i가의 gunna이의 원인이 될 생각)하지만, 약 25 만 행이 나는 쿼리 등을 실행할 때 tmpTable이 완전히 비어 있고 조인이 행을 갱신하지 않더라도 약 650ms가 걸립니다.

나는 이것이 UPDATE의 작동 방식과 관련이 있다고 생각하지만, 그 이유에 대해 누구도 밝힐 수 있습니까? 행 수를 확인할 수있는 빈 테이블에 대해 알고 있지만 tmpTable에 행이있을 때 이것이 내 쿼리의 성능에 영향을 주는지 알고 싶습니다.

모든 조언을 크게 듣습니다.

+1

tbl_Transaction.id에 대한 인덱스가 있습니까? 그렇다면 실행 계획에서'인덱스 탐색 (Index Seek) '을 볼 수 있어야하며 꽤 빠르다. 테이블 스캔을보고 있다면 성능을 확실히 설명 할 수 있습니다. –

+1

tbl_Transaction에는 해당 id에 대한 색인이 있습니다. 나는 그 실행 계획을 완전히 잊었다. 그것을 실행하면 실제로는 삽입 성능이 가장 큰 tbl_Transaction에있는 삽입 트리거 인 것처럼 보입니다. \ 삽입을 실제로하지 않았으므로 그 경우가 될 것이라고 예상하지 못했습니다. –

+1

동일한 것을 업데이트하면 트리거가 실행됩니다. 따라서 문에 where 절을 추가해야합니다. idStatement가 NULL이거나 idStatement가> @idStatement 인 경우 –

답변

1

같은 값으로 업데이트하면 트리거도 실행됩니다

코멘트 t에 명시된대로 당신은 또한 그리고 널

or (@idStatement == null and idStatement is not null) 

으로 업데이트해야하는 경우

UPDATE T 
     SET idStatement = @idStatement 
FROM tbl_Transaction T 
INNER JOIN @tmpTable ST 
    on T.id = ST.idTransaction 
    and idStatement <> @idStatement 

ry a #temp
테이블에 대한 쿼리 최적화가 제한적입니다.

+0

그들은 동일한 값으로 업데이트조차하지 않습니다. 그들은 0 행을 갱신 중입니다. 방아쇠가 시간이 걸리는 경우 행 수에 관계없이 무언가를 수행해야합니다. –

+0

@MartinSmith 마지막 단락을 참조하십시오. – Paparazzi

+1

여전히 행이 0 인 테이블에서 INNER JOIN입니다. 따라서 트리거가 시작되면 INSERTED 및 DELETED 테이블이 모두 비어있게됩니다. 그래서 방아쇠는 아무 것도하지 않을 것입니다. –

1

임시 테이블과 동일한 방식으로 테이블 변수의 인덱스와 일치하지 않기 때문입니다. 당신은 그것을 임시 테이블로 변환 할 수 있으며 그 문제를 가장 잘 해결할 것입니다. 또는이를 시도 할 수 : 변수 테이블과 조인 빨리보다는

UPDATE T 
     SET idStatement = @idStatement 
FROM tbl_Transaction T 
WHERE T.id n IN (SELECT ST.idTransaction from @tmptable) 

이 아마 임시 테이블보다 느리게 될 것입니다하지만