恕我直言,SQL Server 可以自行选择(除非被告知)用于查询的最佳索引是什么。
行
像这样的东西(伪代码)怎么样:
select __a from tbl where __a not in
(
select __b from tbl
)
(假设我们有index_1
哪个是为了(__a)
,index_2
哪个是为了(__b)
SQL Server 是否仍会在执行时使用一个索引或同时使用多个索引...?
恕我直言,SQL Server 可以自行选择(除非被告知)用于查询的最佳索引是什么。
行
像这样的东西(伪代码)怎么样:
select __a from tbl where __a not in
(
select __b from tbl
)
(假设我们有index_1
哪个是为了(__a)
,index_2
哪个是为了(__b)
SQL Server 是否仍会在执行时使用一个索引或同时使用多个索引...?
首先,创建您的表:
USE tempdb;
GO
CREATE TABLE dbo.tbl(__a INT, __b INT);
然后创建两个索引:
CREATE INDEX a_index ON dbo.tbl(__a);
CREATE INDEX b_index ON dbo.tbl(__b);
现在填充一些数据:
INSERT dbo.tbl(__a, __b)
SELECT [object_id], column_id
FROM sys.all_columns;
现在运行您的查询并打开实际的执行计划。您将看到类似这样的内容,表明是的,两个索引都被使用(实际上 __b 上的索引既用于子查询中的数据检索,也用于寻求消除行):
编写查询的更有效方法是:
select __a from dbo.tbl AS t where not exists
(
select 1 from dbo.tbl AS t2
where t2.__b = t.__a
);
现在这是您的整个计划(同样,两个索引都被使用,但请注意操作少得多):