替代TVF中的表变量

时间:2014-12-11 12:35:47

标签: tsql sql-server-2008-r2

我有一个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。 我已经在表变量中添加了索引 - 没有大的成功。

1 个答案:

答案 0 :(得分:1)

尝试重写您的查询以使用联接而不是使用WHERE EXISTS(已知在某些情况下表现更差):

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