0

我有一个表值类型作为存储过程的参数,其中包含多达数千行。我对这个存储过程执行了几个操作(当前是一个 MERGE 和一个 INSERT),但在这些操作之前我想过滤谓词上的参数内容:

@data TableValuedType READONLY

MERGE INTO Table2
USING (
    SELECT ... FROM @data
    UNION
    SELECT ... FROM @data
    UNION
    ...)
ON ...
WHEN NOT MATCHED THEN ....

INSERT INTO Table3
    SELECT ... FROM @data

执行此操作的最有效方法是声明表类型的另一个变量,插入其中,然后使用该变量进行合并和插入:

DECLARE @sanitisedData TableValuedType
INSERT INTO @sanitisedData
    SELECT ... FROM @data
    WHERE <predicate>

或者每次我从@data中选择一些东西时使用谓词:

MERGE INTO Table2
USING (
    SELECT ... FROM @data WHERE <predicate>
    UNION
    SELECT ... FROM @data WHERE <predicate>
    UNION
    ...)
ON ...
WHEN NOT MATCHED THEN ....

INSERT INTO Table3
    SELECT ... FROM @data WHERE <predicate>

或者是其他东西?

4

1 回答 1

0

尽可能避免使用@Table 变量。在大多数情况下,它会导致性能下降。而是选择临时表。

无论如何,表变量和临时表都被写入磁盘,临时表比表变量具有额外的优势,因为它包含查询优化器可以使用的统计信息。您还可以在临时表上创建索引(聚集索引和非聚集索引),而不能创建表变量。

因此,我建议您使用临时表并在您过滤的列上创建索引。

希望这可以帮助。

于 2012-03-28T22:10:00.497 回答