2015-04-04 27 views
1

您能解釋查詢將如何執行嗎?分步說明,請步驟...Oracle如何處理給定的SQL語句

select 
    max(salary), 
    country_id 
from (
    select 
    salary, 
    department_id, 
    location_id, 
    country_id 
    from 
    HR.EMPLOYEES 
    natural join 
    HR.DEPARTMENTS 
    natural join 
    HR.LOCATIONS 
) 
group by country_id; 
+0

優化器將根據所瞭解的有關您的機器和數據的具體情況確定執行的分步說明。 – 2015-04-04 18:43:28

+0

生成解釋計劃並分析自己。 – 2015-04-04 18:52:08

+0

我不認爲它會被執行。我認爲這會引發'ORA-00918:列明確定義錯誤'。 – 2015-04-04 19:41:22

回答

2

瞭解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

估算

的估計器確定在給定的執行計劃的總成本。 的估計產生三種不同類型的措施,以實現 這一目標:

  • 選擇性

    這項措施表示行從行集一小部分。選擇性與查詢謂詞相關聯,如last_name ='Smith', 或謂詞的組合。

  • 基數

    該量度代表行的一排組的數目。

  • 成本

    這一措施表示用於工作或資源的單位。查詢優化器使用磁盤I/O,CPU使用率和內存使用量作爲工作單位。

如果統計數據可用,則估算人員使用它們來計算 度量值。統計數據可以提高 度量的準確度。

我建議閱讀我上面提供的文檔鏈接。