有条件地向临时表添加索引

Ken*_*her 5 index sql-server temporary-tables

我有一个看起来像这样的存储过程:

SELECT columnlist
INTO #temptable
FROM Table
JOIN lotsofothertables
WHERE severalconditions

UPDATE anothertable
SET column = #temptable.column
FROM anothertable 
JOIN #temptable
    ON anothertable.PKColumn = #temptable.PKColumn
Run Code Online (Sandbox Code Playgroud)

初始查询通常只生成几列 (<100),因此更新速度很快。但是偶尔(这些是我们遇到问题的运行)它会产生 1000 甚至 10,000 次。在它们之间添加这样的东西是否合理?

IF @@RowCount > 100
   CREATE INDEX ix_temp ON #temptable(PKColumn)
Run Code Online (Sandbox Code Playgroud)

或者我最好只在表上创建索引,因为行很少,创建索引所花费的时间会相当少?

Mar*_*ith 8

这是有些主观,但我不是在所有的风扇SELECT ... INTO无论如何,通常有一个明确的更换CREATE TABLE,并INSERT ... SELECT为数据类型,列名,和为空然后可以更明确地看到(并且既可以最小日志记录)。

在这种情况下,如果您要在前面的列上创建带有未命名主键约束的临时表

CREATE TABLE #temptable
(
PKColumn INT PRIMARY KEY
)
Run Code Online (Sandbox Code Playgroud)

而不是创建表并在之后添加索引,您将能够从临时表对象缓存中受益(至少可能因为确实存在一些问题)。

我不会费心让它以行数为条件,除非您已经证明存在很少行的索引会以某种方式显着降低性能(不太可能)。

  • 就我个人而言,我从未发现在临时表上放置 PK/索引会在表很小时产生明显的、有害的差异。但是,当桌子最终变大时,它总是有帮助的。 (3认同)