在SQL Server中使用表变量参数优化存储过程的最佳方法是什么?

时间:2018-07-26 19:31:44

标签: sql sql-server database stored-procedures

我有一个接受表变量参数的存储过程。 table变量只有一列,用于传递要查询的主键列表。

表变量定义为:

CREATE TYPE PrimaryKeyList AS TABLE
                              (
                                   PrimaryKey INT NOT NULL
                              )

存储过程的定义类似于:

CREATE PROCEDURE MyStoredProc
    @idList AS PrimaryKeyList READONLY
AS
BEGIN
    SELECT id, col1, col2
    FROM myTable mt
    JOIN @idList ids ON ids.PrimaryKey = mt.id
END

myTable有几百万行,存储过程将遇到长度不同(在1到10,000之间)的PrimaryKeyLists

如何优化表变量结构和存储过程?

将聚簇索引添加到PrimaryKeyList是否有意义?出于相同目的,它将在其他地方重用。

PrimaryKeyList表变量在C#中作为System.Data.DataTable对象生成,并且使用ADO调用存储过程。

已建立索引的PrimaryKeyList和未建立索引的表变量之间的性能有何不同?

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

表变量中的主键将大大提高性能。无需单独构建它,您可以使用扩展定义,并且默认情况下它将作为集群创建(您可以删除NOT NULL)。 可以肯定的是,它应该在myTable.id和更好的主键上具有聚集索引。

CREATE TYPE PrimaryKeyList AS TABLE(
    PrimaryKey INT PRIMARY KEY
)