我只是遇到了必须在索引中包含一列的情况。这需要删除索引,然后重新创建它。这让我想到,这肯定是很多不必要的工作。
假设我先创建了新索引,然后删除了旧索引。让我们假设我有这表明旧索引将不会被丢弃,直到某种方式后,新的已创建了一个。
通过在创建新索引时使用旧索引,服务器会获得任何性能优势吗?
你可以做
CREATE TABLE T(A INT, B INT, C INT)
INSERT INTO T
SELECT 1,1,1
FROM master..spt_values
GO
CREATE INDEX ix ON T(A);
GO
--This won't benefit from existing index as noncovering
CREATE INDEX ix ON T(A) INCLUDE (B) WITH(DROP_EXISTING = ON);
GO
--This can benefit from existing index
CREATE INDEX ix ON T(A) WITH(DROP_EXISTING = ON);
GO
DROP TABLE T;
Run Code Online (Sandbox Code Playgroud)
在第一种情况下这样做没有什么特别的好处。
虽然现有索引提供了所需的排序顺序,但它不会用于此,因为它不包含新添加的列B,因此需要为每一行查找回基表。该计划显示了表扫描和排序。
DROP_EXISTING如果您要删除包含的列,则使用here 可以提供好处- 如在第二个DROP_EXISTING示例中(因为原始索引将具有所需的顺序并覆盖所有列)。
此计划显示读取原始索引以创建替换。