我在 SP 中使用了这个表变量:
DECLARE @t TABLE(ID uniqueidentifier)
然后我向其中插入一些数据(我稍后使用):
INSERT INTO @t(ID)
SELECT ID FROM Categories WHERE ...
后来我有一些基于 @t
ID 的 SELECT
和 UPDATE
,例如:
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时,我在执行计划中看到@t
上有一个Table Scan
。但是当我省略NONCLUSTERED
时,就会出现聚集索引扫描
。
最佳答案
如果您担心性能,您可能不应该使用表变量,而应使用临时表。表变量的问题在于,引用它的语句是在表为空时编译的,因此查询优化器始终假设只有一行。当表变量填充更多行时,这可能会导致性能不佳。
关于主键,使主键聚簇有缺点,因为这会导致表按索引物理排序。查询数据时,此排序操作的开销可能超过性能优势。一般来说,最好添加非聚集索引,但是,一如既往,这将取决于您的特定问题,并且您必须测试不同的实现。
关于sql-server - 在表变量上使用主键来提高查找性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35719163/