SQL 在创建另一个索引时可以使用索引吗?

And*_*son 5 index sql-server

我只是遇到了必须在索引中包含一列的情况。这需要删除索引,然后重新创建它。这让我想到,这肯定是很多不必要的工作。

假设我先创建了新索引,然后删除了旧索引。让我们假设我有这表明旧索引将不会被丢弃,直到某种方式后,新的已创建了一个。

通过在创建新索引时使用旧索引,服务器会获得任何性能优势吗?

Mar*_*ith 8

你可以做

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示例中(因为原始索引将具有所需的顺序并覆盖所有列)。

此计划显示读取原始索引以创建替换。

在此处输入图片说明