选择数据后索引是否仍然有效?

y62*_*ang 1 sql-server indexing join

我有两个表要加入,它们都有我想要加入的列的索引.

查询1

SELECT * FROM [A] INNER JOIN [B] ON [A].F = [B].F;
Run Code Online (Sandbox Code Playgroud)

查询2

SELECT * FROM (SELECT * FROM [A]) [A1] INNER JOIN (SELECT * FROM B) [B1] ON [A1].F=[B1].F
Run Code Online (Sandbox Code Playgroud)

第一个查询显然会利用索引,第二个查询呢?在执行括号中的两个select语句之后,会发生join,但我的猜测是索引无法加速查询,因为它几乎是一个新表.

Jus*_*sel 5

查询的执行方式与您建议的完全不同,首先执行内部查询,然后将结果与外部查询结合使用.优化器将采用您的查询,并将查看许多可能的方法,以通过各种连接顺序,索引使用等等获取您的数据,并提出一个感觉最佳的计划.

如果您执行两个查询并查看各自的执行计划,我认为您会发现它们使用完全相同的查询.

这是一个相同概念的简单例子.我创建了我的架构:

CREATE TABLE A (id int, value int)
CREATE TABLE B (id int, value int)

INSERT INTO A (id, value)
VALUES (1,900),(2,800),(3,700),(4,600)

INSERT INTO B (id, value)
VALUES (2,800),(3,700),(4,600),(5,500)

CREATE CLUSTERED INDEX IX_A ON A (id)
CREATE CLUSTERED INDEX IX_B ON B (id)
Run Code Online (Sandbox Code Playgroud)

并运行您提供的查询.

SELECT * FROM A INNER JOIN B ON A.id = B.id 
SELECT * FROM (SELECT * FROM A) A1 INNER JOIN (SELECT * FROM B) B1 ON A1.id = B1.id 
Run Code Online (Sandbox Code Playgroud)

生成的计划如下所示:

在此输入图像描述

正如您所看到的,两者都使用索引.