在 Table 变量上使用主键来提高查找性能

Using Primary Key on Table Variable to improve seek performance

我在 SP 中使用了这个 table 变量:

DECLARE @t TABLE(ID uniqueidentifier)

然后我往里面插入一些数据(以后用):

INSERT INTO @t(ID)
SELECT ID FROM Categories WHERE ...

后来我有一些 SELECTUPDATE 基于 @t ID 例如:

SELECT * FROM Categories A INNER JOIN @t T ON A.ID = T.ID

etc..

我是否应该在 SELECT / UPDATE 语句中声明 ID uniqueidentifier PRIMARY KEY 以增加持久性? 如果是,它应该是集群还是非集群? 在我的情况下,建议的选择是什么?

编辑: 我在数据库中的所有 table 都有 uniqueidentifier (ID) 列作为主键 NONCLUSTERED

EDIT2 : 奇怪的是(或不是)当我试图在 table 变量上使用 PRIMARY KEY NONCLUSTERED 时,当使用连接 SELECT 我在执行计划中看到 @t 上有一个 Table Scan。但是当我省略 NONCLUSTERED 时,有一个 Clustered Index Scan.

如果您担心性能,您可能不应该使用 table 变量,而应使用临时的 table。 table 变量的问题是当 table 为空时编译引用它的语句,因此查询优化器总是假设只有一行。当 table 变量填充了更多行时,这可能会导致性能不佳。

关于主键,使主键聚簇有一些缺点,因为它会导致 table 按索引进行物理排序。这种排序操作的开销可能会超过查询数据时的性能优势。一般来说,最好添加一个非聚集索引,但是,一如既往,这将取决于您的特定问题,您将不得不测试不同的实现。