【问题标题】:What's the best way to optimize a stored procedure with a table variable parameter in SQL Server? [duplicate]在 SQL Server 中使用表变量参数优化存储过程的最佳方法是什么? [复制]
【发布时间】:2018-07-26 19:31:43
【问题描述】:

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

表变量定义为:

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 有几百万行,存储过程将遇到不同长度的PrimaryKeyLists(介于1 到大约10,000 之间)。

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

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

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

索引和非索引PrimaryKeyList 表变量的性能有何不同?

有更好的方法吗?

【问题讨论】:

  • TABLE 变量可以变形为临时表。你可以这样创建索引:DECLARE @x TABLE (id int, INDEX IX_id CLUSTERED(id));

标签: sql sql-server database stored-procedures


【解决方案1】:

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

CREATE TYPE PrimaryKeyList AS TABLE(
    PrimaryKey INT PRIMARY KEY
)

【讨论】:

    猜你喜欢
    • 2021-12-06
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2010-09-05
    • 2011-05-24
    相关资源
    最近更新 更多