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