我有一个TVF,并在其中使用表变量。 最后一步是删除它的几行(数千)。 确切地说,此查询会显着增加运行时间。 使用临时表更改代码会再次减少运行时间,但不幸的是,临时表不能在TVF中使用。 我无法将TVF改为SPROC。
任何想法如何提高性能?
我只添加了TVF的一部分,它减慢了一切。在此之前,收集时间戳并在@Result
中进行预处理。 @C
收集包含此时必须修改的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 :(得分:1)
尝试重写您的查询以使用联接而不是使用WHERE EXISTS
(已知在某些情况下表现更差):
UPDATE R
. . .
FROM @Result AS R
INNER JOIN @c AS c ON c."id" = R."id"