本篇教程介紹在 OceanBase 開發(fā)者中心(OceanBase Developer Center,ODC)中查看 SQL 性能的詳細步驟。
背景信息
SQL (Structured Query Language) 是具有數(shù)據(jù)操縱和數(shù)據(jù)定義等多種功能的數(shù)據(jù)庫語言,大多數(shù)數(shù)據(jù)庫開發(fā)者依賴 SQL 語言對數(shù)據(jù)庫內(nèi)容進行管理與開發(fā)。所以 SQL 的性能一定程度上會影響數(shù)據(jù)庫的性能,SQL 本身提供了執(zhí)行計劃命令(EXPLAIN 命令 )供用戶查看語句在數(shù)據(jù)庫中具體的執(zhí)行步驟并以此作為判斷 SQL 性能和改進 SQL 語句的依據(jù)。
OceanBase 開發(fā)者中心(OceanBase Developer Center,ODC)作為一款強大的企業(yè)級數(shù)據(jù)庫開發(fā)平臺,提供了圖形化查看 SQL 語句執(zhí)行計劃的功能。借助 ODC 您可以更直觀便捷查看 SQL 語句的執(zhí)行情況并分析 SQL 語句的性能。
前提條件
運行下述語句,創(chuàng)建示例表 employees:
CREATE TABLE employees(
emp_id INTEGER,
emp_name VARCHAR(20),
manager_id INTEGER
);
INSERT INTO employees VALUES ( 1, 'Anna', 6 ) ;
INSERT INTO employees VALUES ( 2, 'Brain', 4 ) ;
INSERT INTO employees VALUES ( 3, 'Candy', 4 ) ;
INSERT INTO employees VALUES ( 4, 'David', 5 ) ;
INSERT INTO employees VALUES ( 5, 'Eva', NULL) ;
INSERT INTO employees VALUES ( 6, 'Frank', 5 ) ;
INSERT INTO employees VALUES ( 7, 'Gary', 6 ) ;
操作步驟
- 進入連接后,在 SQL 窗口的編輯區(qū)中輸入下述 ?SELECT? 命令查看表 employees 中的數(shù)據(jù)。
SELECT * FROM employees;
- 單擊編輯區(qū)工具欄右上角的 計劃 按鈕。在運行命令前,可以先通過編輯區(qū)中的 計劃 按鈕,查看當(dāng)前編輯區(qū)選中的或當(dāng)前光標(biāo)所在的 SQL 語句在執(zhí)行前系統(tǒng)預(yù)估的執(zhí)行計劃(?
EXPLAIN PLAN
? 操作的結(jié)果),展示的執(zhí)行數(shù)據(jù)可能與實際執(zhí)行語句后的數(shù)據(jù)略有不用,但是可以使用該功能預(yù)先評估 SQL 語句。
- 在彈出的 計劃詳情 面板中,查看 SQL 運行前預(yù)估的執(zhí)行計劃。計劃詳請 面板中的 計劃統(tǒng)計 頁簽會展示以下信息:
- 算子:常見算子包含表訪問(TABLE SCAN 和 TABLE GET)、連接(NESTED-LOOP、BLK-NESTED-LOOP、MERGE 和 HASH)、排序(SORT 和 TOP-N SORT)、聚合(MERGE GROUP-BY、HASH GROUP-BY 和 WINDOW FUNCTION)、跨分區(qū)(EXCHANGE IN、OUT REMOTE 和 DISTRIBUTE)、集合(UNION、EXCEPT、INTERSECT 和MINUS)、其他(LIMIT、MATERIAL、SUBPLAN、EXPRESSION
和 COUNT)。
- 名稱:該算子涉及的對象名稱。預(yù)估行:該算子向上輸出的記錄數(shù),越大說明情況越不理想。
- 代價:花費的代價,越大說明情況越不理想。
- 輸出過濾(附加信息):目前只有 TABLE SCAN 算子有這部分內(nèi)容,該部分會提供一些更詳細的信息。
- 運行語句。
單擊工具欄中的 運行 按鈕,執(zhí)行? ?SELECT?
? 語句。
- 在結(jié)果集的工具欄中單擊 計劃 按鈕查看執(zhí)行后的執(zhí)行計劃。
此時在彈出的 執(zhí)行詳情 中,展示的是語句執(zhí)行后實際的執(zhí)行計劃。
- 在 執(zhí)行詳情 面板查看語句的 基本信息。基本信息 模塊主要展示了以下信息:
- SQL ID:相同 SQL 的唯一標(biāo)識。
- SQL:具體執(zhí)行的 SQL 文本。
- TRACE ID:該執(zhí)行 SQL 的全局唯一標(biāo)識。
- 請求到達時間:數(shù)據(jù)庫接收到 SQL 請求的時間點。
- 計劃類型:有本地、遠程、分布式三種,性能依次下降。<、li>
- 是否命中緩存:是否使用的是已經(jīng)存在的執(zhí)行計劃(命中可避免硬解析,效率會高)。
- 在 執(zhí)行詳情 面板查看語句的 耗時統(tǒng)計。
耗時統(tǒng)計 模塊通過條形圖形象的展示了以下信息及它們之間的占比:
- 排隊時間:SQL 在等待隊列中時間,如果排隊時間過長,可能存在 CPU 資源爭用。
- 執(zhí)行時間:SQL 的實際執(zhí)行耗時(包含內(nèi)部等待時間)。
- 其它:通過數(shù)據(jù)庫收到請求到執(zhí)行結(jié)束消耗時間減去排隊時間再減去執(zhí)行時間得到,如果該值過大,需檢查下網(wǎng)絡(luò)、磁盤是否正常。
- 在 執(zhí)行詳情 面板查看語句的 IO 統(tǒng)計。
IO 統(tǒng)計 模塊主要展示了以下信息:
- RPC 次數(shù):發(fā)送 RPC 的個數(shù)。OceanBase 集群作為一個分布式系統(tǒng),機器間的通信是通過 RPC 完成的,如果執(zhí)行計劃中 rpc_count 的值過高,意味著執(zhí)行的 SQL 需要頻繁的進行多機通信,才能完成該 SQL 請求。需要具體分析 SQL 需要訪問的數(shù)據(jù)是否分布在多臺機器上,RPC 過高一般是因為遠程執(zhí)行或分布式執(zhí)行過多,需進一步檢查 SQL 執(zhí)行狀態(tài)。
- 物理讀次數(shù):讀取物理磁盤上數(shù)據(jù)的次數(shù),該值不為 0,可能原因有內(nèi)存不夠、索引不優(yōu) 和 SQL 本身獲取的結(jié)果集過大等三種原因。建議查看 SQL 和索引是否存在優(yōu)化空間。
- SSSTORE 中讀取的次數(shù):SSTABLE 中讀取的行數(shù),如果該值過大,需注意該 SQL 是否獲取的結(jié)果集過大或者索引是否友好。
- 在 執(zhí)行詳情 面板查看語句的 計劃統(tǒng)計。
計劃統(tǒng)計 頁簽結(jié)構(gòu)化的展示了語句執(zhí)行后的執(zhí)行計劃。它同 計劃詳情 頁面中的結(jié)構(gòu)一樣,詳情可查看步驟 3 中 計劃統(tǒng)計 的信息。
- 在 執(zhí)行詳情 面板查看語句的 大綱。
大綱 頁簽展示了執(zhí)行計劃返回的結(jié)果中 OUTLINE DATA 對應(yīng)的內(nèi)容。這部分內(nèi)容是優(yōu)化器為了完全復(fù)現(xiàn)某一計劃而生成的一組 Hint 信息。
更多建議: