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

zig*_*zig 2 sql-server primary-key table-variable

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

DECLARE @t TABLE(ID uniqueidentifier)
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO @t(ID)
SELECT ID FROM Categories WHERE ...
Run Code Online (Sandbox Code Playgroud)

而后来我有几个SELECTUPDATE基于@tID的,例如:

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

etc..
Run Code Online (Sandbox Code Playgroud)

我应该声明ID uniqueidentifier PRIMARY KEY增加SELECT/ UPDATEstatements中的持久性吗?如果是,它应该是群集还是非群集?我的建议选项是什么?

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

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

Ale*_*lex 5

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

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