SQL Server可以使用多个索引吗?

Roy*_*mir 0 sql-server indexing sql-server-2008

恕我直言SQL Server可以选择自己(除非被告知)什么是用于查询的最佳索引.

这样的事情(伪代码):

select __a from tbl where __a not in
 (
   select __b  from tbl 

 ) 
Run Code Online (Sandbox Code Playgroud)

(假设我们拥有的index_1是哪个(__a),index_2哪个是(__b)

SQL Server是否仍会在执行时使用一个索引或多个索引一起使用......?

Aar*_*and 6

首先,创建表:

USE tempdb;
GO
CREATE TABLE dbo.tbl(__a INT, __b INT);
Run Code Online (Sandbox Code Playgroud)

然后创建两个索引:

CREATE INDEX a_index ON dbo.tbl(__a);
CREATE INDEX b_index ON dbo.tbl(__b);
Run Code Online (Sandbox Code Playgroud)

现在填充一些数据:

INSERT dbo.tbl(__a, __b)
  SELECT [object_id], column_id
    FROM sys.all_columns;
Run Code Online (Sandbox Code Playgroud)

现在运行您的查询并启用实际执行计划.您将看到类似的内容,显示是,使用了两个索引(实际上__b上的索引既用于子查询中的数据检索,也用于消除行的搜索):

在此输入图像描述

编写查询的更有效方法是:

select __a from dbo.tbl AS t where not exists
 (
   select 1 from dbo.tbl AS t2 
     where t2.__b = t.__a
 );
Run Code Online (Sandbox Code Playgroud)

现在这是你的整个计划(同样,两个索引都被使用,但注意如何减少操作):

在此输入图像描述