使用表变量上的主键来提高搜索性能

时间:2016-03-01 09:33:36

标签: sql-server primary-key table-variable

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

DECLARE @t TABLE(ID uniqueidentifier)

然后我将一些数据插入其中(我稍后使用):

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

之后我根据SELECT ID获得了一些UPDATE@t,例如:

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

etc..

我是否应声明ID uniqueidentifier PRIMARY KEY以增加SELECT / UPDATE声明中的永久性? 如果是,它应该是群集还是非群集? 在我的案例中,建议的选项是什么?

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

EDIT2:当我尝试在表变量上使用PRIMARY KEY NONCLUSTERED时,奇怪(或没有),当使用连接的SELECT时,我在执行计划中看到有一个{在Table Scan上{1}}。但是当我省略@t时,会有NONCLUSTERED

1 个答案:

答案 0 :(得分:5)

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

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