日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

来来来!一次搞定各种数据库 SQL 执行计划:MySQL、Oracle

發(fā)布時(shí)間:2024/9/27 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 来来来!一次搞定各种数据库 SQL 执行计划:MySQL、Oracle 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


執(zhí)行計(jì)劃(execution plan,也叫查詢計(jì)劃或者解釋計(jì)劃)是數(shù)據(jù)庫(kù)執(zhí)行 SQL 語(yǔ)句的具體步驟,例如通過索引還是全表掃描訪問表中的數(shù)據(jù),連接查詢的實(shí)現(xiàn)方式和連接的順序等。如果 SQL 語(yǔ)句性能不夠理想,我們首先應(yīng)該查看它的執(zhí)行計(jì)劃。本文主要介紹如何在各種數(shù)據(jù)庫(kù)中獲取和理解執(zhí)行計(jì)劃,并給出進(jìn)一步深入分析的參考文檔。

現(xiàn)在許多管理和開發(fā)工具都提供了查看圖形化執(zhí)行計(jì)劃的功能,例如 MySQL Workbench、Oracle SQL Developer、SQL Server Management Studio、DBeaver 等;不過我們不打算使用這類工具,而是介紹利用數(shù)據(jù)庫(kù)提供的命令查看執(zhí)行計(jì)劃。

我們先給出在各種數(shù)據(jù)庫(kù)中查看執(zhí)行計(jì)劃的一個(gè)簡(jiǎn)單匯總:

數(shù)據(jù)庫(kù)執(zhí)行計(jì)劃
MySQLEXPLAIN sql_statement;
OracleEXPLAIN PLAN FOR sql_statement;
SELECT * FROM TABLE(DBMS_XPLAN.display);
SQL ServerSET STATISTICS PROFILE ON;
sql_statement;
SET STATISTICS PROFILE OFF;
PostgreSQLEXPLAIN sql_statement;
SQLiteEXPLAIN QUERY PLAN sql_statement;

MySQL 執(zhí)行計(jì)劃
MySQL 中獲取執(zhí)行計(jì)劃的方法很簡(jiǎn)單,就是在 SQL 語(yǔ)句的前面加上EXPLAIN關(guān)鍵字:

EXPLAIN SELECT e.first_name,e.last_name,e.salary,d.department_nameFROM employees eJOIN departments d ON (e.department_id = d.department_id)WHERE e.salary > 15000;

執(zhí)行該語(yǔ)句將會(huì)返回一個(gè)表格形式的執(zhí)行計(jì)劃,包含了 12 列信息:

id|select_type|table|partitions|type |possible_keys |key |key_len|ref |rows|filtered|Extra | --|-----------|-----|----------|------|-----------------|-------|-------|--------------------|----|--------|-----------|1|SIMPLE |e | |ALL |emp_department_ix| | | | 107| 33.33|Using where|1|SIMPLE |d | |eq_ref|PRIMARY |PRIMARY|4 |hrdb.e.department_id| 1| 100| |

MySQL 中的EXPLAIN支持 SELECT、DELETE、INSERT、REPLACE 以及 UPDATE 語(yǔ)句。

Oracle 執(zhí)行計(jì)劃
Oracle 中提供了多種查看執(zhí)行計(jì)劃的方法,本文使用以下方式:

使用EXPLAIN PLAN FOR命令生成并保存執(zhí)行計(jì)劃;
顯示保存的執(zhí)行計(jì)劃。
首先,生成執(zhí)行計(jì)劃:

EXPLAIN PLAN FOR SELECT e.first_name,e.last_name,e.salary,d.department_nameFROM employees eJOIN departments d ON (e.department_id = d.department_id)WHERE e.salary > 15000;

EXPLAIN PLAN FOR命令不會(huì)運(yùn)行 SQL 語(yǔ)句,因此創(chuàng)建的執(zhí)行計(jì)劃不一定與執(zhí)行該語(yǔ)句時(shí)的實(shí)際計(jì)劃相同。

該命令會(huì)將生成的執(zhí)行計(jì)劃保存到全局的臨時(shí)表 PLAN_TABLE 中,然后使用系統(tǒng)包 DBMS_XPLAN 中的存儲(chǔ)過程格式化顯示該表中的執(zhí)行計(jì)劃。以下語(yǔ)句可以查看當(dāng)前會(huì)話中的最后一個(gè)執(zhí)行計(jì)劃:

SELECT * FROM TABLE(DBMS_XPLAN.display); PLAN_TABLE_OUTPUT | --------------------------------------------------------------------------------------------| Plan hash value: 1343509718 || --------------------------------------------------------------------------------------------| | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time || --------------------------------------------------------------------------------------------| | 0 | SELECT STATEMENT | | 44 | 1672 | 6 (17)| 00:00:01 || | 1 | MERGE JOIN | | 44 | 1672 | 6 (17)| 00:00:01 || | 2 | TABLE ACCESS BY INDEX ROWID| DEPARTMENTS | 27 | 432 | 2 (0)| 00:00:01 || | 3 | INDEX FULL SCAN | DEPT_ID_PK | 27 | | 1 (0)| 00:00:01 || |* 4 | SORT JOIN | | 44 | 968 | 4 (25)| 00:00:01 || |* 5 | TABLE ACCESS FULL | EMPLOYEES | 44 | 968 | 3 (0)| 00:00:01 || --------------------------------------------------------------------------------------------|| Predicate Information (identified by operation id): | --------------------------------------------------- ||4 - access("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID") |filter("E"."DEPARTMENT_ID"="D"."DEPARTMENT_ID") |5 - filter("E"."SALARY">15000) |

Oracle 中的EXPLAIN PLAN FOR支持 SELECT、UPDATE、INSERT 以及 DELETE 語(yǔ)句。

總結(jié)

以上是生活随笔為你收集整理的来来来!一次搞定各种数据库 SQL 执行计划:MySQL、Oracle的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。