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