我有一个看起来像这样的存储过程:
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
初始查询通常只会生成几列 (<100),因此更新速度很快。但偶尔(这些是我们遇到问题的运行)它会产生 1000 甚至 10,000。在它们之间添加这样的东西是否合理?
IF @@RowCount > 100
CREATE INDEX ix_temp ON #temptable(PKColumn)
还是我最好只在表上创建索引,因为行数很少,创建索引所花费的时间会相当少?
这有点主观,但我一点也不喜欢
SELECT ... INTO
,通常用显式替换它,CREATE TABLE
因为INSERT ... SELECT
数据类型、列名和可空性可以更明确地看到(并且两者都可以最少记录)。在这种情况下,如果您要在前面的列上使用未命名的主键约束创建临时表
而不是创建表并在之后添加索引,您将能够从临时表对象缓存中受益(至少可能因为它确实存在一些问题)。
我不会费心让它以行数为条件,除非你已经证明存在很少行的索引会以某种方式显着降低性能(不太可能)。