不执行查询这么彻底为你的建议,其中内查询第一,那么他们的执行结果与外部查询结合使用。优化器会接受您的查询,并会查看许多可能的方式,通过各种连接命令,索引用法等获取数据,并提出一个感觉足够优化的计划。
如果你执行两个查询并查看它们各自的执行计划,我想你会发现它们使用完全相同的执行计划。
下面是一个简单的相同概念的例子。我创建了我的模式,如下所示:
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
中生成的计划是这样的:
其中,你可以看到,无论是利用指数。
实际上,两个查询都返回相同的结果。 两者都应该使用索引(检查查询计划) 真正的问题是为什么你会想要使用query2? – Jimbo 2012-07-12 20:09:11
“FROM [A]”和“FROM(SELECT * FROM [A])As [A]”是一回事。 – RBarryYoung 2012-07-12 20:23:17
@Jimbo,我将它抽象为一个更简单的例子。因为这两个子查询是在不同阶段构建的,然后组合起来形成一个更大的查询,这就是为什么我有查询2而不是查询1 – y62wang 2012-07-12 21:28:20