在 SSMS 中测试存储过程时,有时会说
#someTempTable____________________000000000000005B] (someField)
etc 等上缺少索引
当我像这样将它们添加到sp时:
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[#someTable] ([someField])
GO
我似乎从来没有看到速度提高。所以,我经常不添加这样的索引。我应该何时添加此类索引?
如果您将在查询运行期间使用临时表及其索引两次或更多次,请添加索引。
或者维护通常的索引任务,比如唯一性
如果加载到临时表中的数据已经排序,则创建具有与排序数据相同的聚集索引的临时表
但
考虑到 sql server 的临时表重用功能- 如果您决定在临时表上创建索引 - 尝试在 CREATE TABLE 语句中执行此操作。如果您在创建表后显式添加索引 - 它将阻止 sql server 下次重用该表
如果没有更多信息,这很难回答。一般来说,我会说,“这取决于”。
一般来说,如果索引的好处大于原始执行成本加上创建索引的成本,我会在临时表中添加索引。您必须以 SET STATISTICS IO 为例进行基准测试。我还想查看添加索引之前和之后使用的执行计划。有时推荐的索引并不是很好的推荐索引:-)
鉴于您指定的临时表具有本地范围(由单个 # 表示),通常最好不要添加索引,因为该表只会在连接期间保持活动状态。
您应该在表发生显着变化后更新统计信息,例如:创建 tempTable、添加索引、插入 10k 条记录...更新统计信息。