sql-server - 在表变量上使用主键来提高查找性能

标签 sql-server primary-key table-variable

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

DECLARE @t TABLE(ID uniqueidentifier)

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

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

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

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/

相关文章:

sql - 从 SQL Server Service Broker 提取消息

sql-server - 如何将表名作为存储过程的输入参数?

sql-server - 尝试在 SQL 中运行 UPDATE 语句时出现 "Must declare the scalar variable"

sql - 检查并更改 SQL 中列的空值或 null 值?

使用 join 时 Sql Count 显示错误数据

entity-framework - 使用 Entity Framework 4.0 的复合数据库键

mysql 主键以模式开头

sql-server - 如何声明两个具有相同结构的表变量?

sql - TSQL RAND 随机值

sql - 具有时间有效性的 Oracle 表的主键违规