在 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 ...
后来我有一些 SELECT
和 UPDATE
基于 @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 按索引进行物理排序。这种排序操作的开销可能会超过查询数据时的性能优势。一般来说,最好添加一个非聚集索引,但是,一如既往,这将取决于您的特定问题,您将不得不测试不同的实现。
我在 SP 中使用了这个 table 变量:
DECLARE @t TABLE(ID uniqueidentifier)
然后我往里面插入一些数据(以后用):
INSERT INTO @t(ID)
SELECT ID FROM Categories WHERE ...
后来我有一些 SELECT
和 UPDATE
基于 @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 按索引进行物理排序。这种排序操作的开销可能会超过查询数据时的性能优势。一般来说,最好添加一个非聚集索引,但是,一如既往,这将取决于您的特定问题,您将不得不测试不同的实现。