瞭解SQL的執行步驟,最好的辦法是產生解釋計劃,並從最裏面ID
分析到最外層。
SQL> explain plan for
2 select
3 max(salary),
4 country_id
5 from (
6 select
7 salary,
8 department_id,
9 location_id,
10 country_id
11 from
12 HR.EMPLOYEES
13 natural join
14 HR.DEPARTMENTS
15 natural join
16 HR.LOCATIONS
17 )
18 group by country_id;
Explained.
SQL>
讓我們顯示以可讀格式解釋計劃:
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------
Plan hash value: 1571404374
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 11 | 297 | 8 (0)| 00:00:01 |
| 1 | HASH GROUP BY | | 11 | 297 | 8 (0)| 00:00:01 |
|* 2 | HASH JOIN | | 11 | 297 | 8 (0)| 00:00:01 |
| 3 | MERGE JOIN | | 11 | 176 | 5 (0)| 00:00:01 |
| 4 | TABLE ACCESS BY INDEX ROWID| LOCATIONS | 23 | 138 | 2 (0)| 00:00:01 |
| 5 | INDEX FULL SCAN | LOC_ID_PK | 23 | | 1 (0)| 00:00:01 |
|* 6 | SORT JOIN | | 11 | 110 | 3 (0)| 00:00:01 |
|* 7 | TABLE ACCESS FULL | DEPARTMENTS | 11 | 110 | 3 (0)| 00:00:01 |
| 8 | TABLE ACCESS FULL | EMPLOYEES | 107 | 1177 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("EMPLOYEES"."DEPARTMENT_ID"="DEPARTMENTS"."DEPARTMENT_ID" AND
"EMPLOYEES"."MANAGER_ID"="DEPARTMENTS"."MANAGER_ID")
6 - access("DEPARTMENTS"."LOCATION_ID"="LOCATIONS"."LOCATION_ID")
filter("DEPARTMENTS"."LOCATION_ID"="LOCATIONS"."LOCATION_ID")
7 - filter("DEPARTMENTS"."MANAGER_ID" IS NOT NULL)
Note
-----
- this is an adaptive plan
28 rows selected.
SQL>
的查詢變壓器可以決定是否要重寫查詢,以便優化可能會產生更好的執行計劃。
從documentation:
估算
的估計器確定在給定的執行計劃的總成本。 的估計產生三種不同類型的措施,以實現 這一目標:
如果統計數據可用,則估算人員使用它們來計算 度量值。統計數據可以提高 度量的準確度。
我建議閱讀我上面提供的文檔鏈接。
優化器將根據所瞭解的有關您的機器和數據的具體情況確定執行的分步說明。 – 2015-04-04 18:43:28
生成解釋計劃並分析自己。 – 2015-04-04 18:52:08
我不認爲它會被執行。我認爲這會引發'ORA-00918:列明確定義錯誤'。 – 2015-04-04 19:41:22