TSQ:寻找索引相对较小的临时表的指南

时间:2016-07-26 16:33:21

标签: sql-server performance tsql

使用SQL Server 2014:

在我的TSQL数据库应用程序中,我创建了临时表,其中包含我正在使用的记录的主键ID。

DECLARE @TempListOfIDs TABLE(PKID BIGINT) 
  • 该表格将包含1000-5000个项目。这是存储过程在每次执行时需要完成的工作块。我用这种方法限制了工作量。
  • 我使用临时表将它与相当大的表连接起来,所有这些表都基于PKID具有聚簇索引。因此,在较大的表侧进行连接是非常优化的,但对于临时表侧则不确定。

问题是我应该在@ TempListOfIDs.PKID列上创建聚簇索引吗?我担心表中的行数如此之少(< 5000行),在临时表上创建聚簇索引的成本超过了它的好处。

3 个答案:

答案 0 :(得分:3)

这是一个表变量而不是临时表。

假设您插入的值是唯一的,我可能会使用

DECLARE @TempListOfIDs TABLE(PKID BIGINT PRIMARY KEY) 

表变量没有列统计信息,约束可以提供一些有用的密度信息。另外,您应该考虑使用OPTION (RECOMPILE),以便考虑表变量的行数。

此外,支持索引对某些执行计划肯定有用。例如,如果表变量最终位于嵌套循环连接的内部。

如果这是一些性能关键的代码,那么当然只是测试它。

答案 1 :(得分:1)

在您的情况下确定的唯一方法是测试两种情况。我个人认为,如果你正在进行内部联接,这是不值得的。

SQL应该认识到需要来自小表的所有记录/列,因此任何索引都将被忽略。即使使用索引,也需要进行全表扫描。

答案 2 :(得分:0)

聚簇索引可能没有帮助,但如果按聚簇索引的顺序添加值,那么它将花费很少。

从两个方面看一些查询计划。