我在我的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
。
答案 0 :(得分:5)
如果您担心性能,可能不应该使用表变量,而是使用临时表。表变量的问题是当表为空时编译引用它的语句,因此查询优化器总是假定只有一行。当表变量填充更多行时,这可能导致性能欠佳。
关于主键,有一些缺点使主要集群,因为它将导致表由索引物理排序。查询数据时,此排序操作的开销可能会超过性能优势。一般来说,最好添加一个非聚集索引,但是,一如既往,它将取决于您的特定问题,您将不得不测试不同的实现。