查询并没有像您建议的那样按字面意思执行,首先执行内部查询,然后将它们的结果与外部查询组合。优化器将接受您的查询,并会考虑通过各种连接顺序、索引使用等获取数据的许多可能方法,并提出一个它认为足够优化的计划。
如果您执行这两个查询并查看它们各自的执行计划,我想您会发现它们使用完全相同的一个。
这是相同概念的一个简单示例。我这样创建了我的架构:
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)
并运行您提供的查询。
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
生成的计划如下所示:

如您所见,两者都使用索引。