我有一个接受表变量参数的存储过程。 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
和未建立索引的表变量之间的性能有何不同?
有更好的方法吗?
答案 0 :(得分:1)
表变量中的主键将大大提高性能。无需单独构建它,您可以使用扩展定义,并且默认情况下它将作为集群创建(您可以删除NOT NULL)。
可以肯定的是,它应该在myTable.id
和更好的主键上具有聚集索引。
CREATE TYPE PrimaryKeyList AS TABLE(
PrimaryKey INT PRIMARY KEY
)