2014-12-11 4 views
0

나는 TVF를 가지고 있으며 그 안에 테이블 변수를 사용합니다. 마지막 단계 중 하나는 여러 줄을 지우는 것입니다. 정확히이 쿼리는 런타임을 크게 늘립니다. 임시 테이블을 사용하여 코드를 변경하면 런타임이 다시 줄어들지 만 불행히도 임시 테이블은 TVF에서 사용하지 않아야합니다. TVF를 SPROC로 변경할 수 없습니다.TVF의 테이블 변수 대신

성능을 향상시키는 방법에 대한 아이디어가 있으십니까?

TVF의 모든 부분을 느리게하는 부분 만 추가했습니다. 그 전에는 타임 스탬프가 수집되어 @Result으로 사전 처리됩니다. @C collects에는 현재 수정해야하는 ID가 포함됩니다. 위의 코드가 업데이트없이 실행하면

UPDATE R 
SET starttime = CASE R."myFunction" 
        WHEN 1 THEN Date1 
        WHEN 0 THEN Date2 
       END 
FROM @Result AS R 
WHERE EXISTS (
    SELECT 
     NULL 
    FROM @c AS c 
    WHERE c."id" = R."id") 

은 거의 즉시 실행, 그래서 나는 오른쪽 양면 기능은 병목 현상이라고 생각합니다. SET starttime...을 고정 값으로 변경하더라도 런타임은 거의 동일하게 유지됩니다. @Result은 약 250.000 라인, @c 약 20.000을 유지합니다. 이미 테이블 바스에 인덱스를 추가했습니다. 큰 성공을 거두지 않았습니다.

+0

을 내가 당신을 제안 할 경우에만 새와 함께 새로운 @table_variable을 만들려고하는' starttime'과'id' 그리고 나중에 @Result 테이블과 JOIN하여 최종 결과를 생성합니다. 요점은 INSERT에 UPDATE를 대체하고 나중에 EXISTS가 중요한 차이를 만들지 않고 나중에 JOIN –

답변

1

시도는 대신 (경우에 따라 더 수행하는 것으로 알려져있는) WHERE EXISTS를 사용하는 조인을 사용하는 쿼리를 다시 작성하기 :

UPDATE R 
    . . . 
FROM @Result AS R 
INNER JOIN @c AS c ON c."id" = R."id" 
+0

INNER JOIN으로 바꾸는 것입니다. – Nico

+0

@Nico 당신이 이것을 확인합니까, 아니면 그냥 차이가 없다는 가정입니까? – Vasily

+0

@Vasily 나는 이것을 검사했다. – Nico