不執行查詢這麼徹底爲你的建議,其中內查詢第一,那麼他們的執行結果與外部查詢結合使用。優化器會接受您的查詢,並會查看許多可能的方式,通過各種連接命令,索引用法等獲取數據,並提出一個感覺足夠優化的計劃。
如果你執行兩個查詢並查看它們各自的執行計劃,我想你會發現它們使用完全相同的執行計劃。
下面是一個簡單的相同概念的例子。我創建了我的模式,如下所示:
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