AnalyticDB PostgreSQL版提供了查詢執(zhí)行信息收集(Query Profiling Statistics)功能,開啟該功能后,系統(tǒng)會自動收集并記錄查詢執(zhí)行過程的統(tǒng)計信息,您可以通過系統(tǒng)視圖瀏覽并檢查執(zhí)行較慢的SQL查詢語句。
在AnalyticDB PostgreSQL版中,查詢的執(zhí)行過程被分解為多個算子并依次執(zhí)行。在特定情況下,為了排查與分析查詢執(zhí)行的異常狀態(tài),需要查看查詢執(zhí)行過程的細(xì)節(jié)數(shù)據(jù),例如某一特定算子執(zhí)行過程消耗的時間,輸入輸出的行數(shù),占用的資源(內(nèi)存,I/O)等。AnalyticDB PostgreSQL版支持查詢執(zhí)行細(xì)節(jié)信息收集和記錄,通過查詢中各個算子的執(zhí)行記錄,您可以發(fā)現(xiàn)執(zhí)行過程中存在的問題,進(jìn)而排查并分析異常問題。
開啟查詢執(zhí)行信息收集功能
默認(rèn)情況下,查詢執(zhí)行信息收集功能處于關(guān)閉狀態(tài),您可以通過queryprofile.enable參數(shù)開啟或關(guān)閉該功能。
- 查看當(dāng)前查詢執(zhí)行信息收集狀態(tài):
SHOW queryprofile.enable;
- 會話級別開啟查詢執(zhí)行信息收集功能:
SET queryprofile.enable = ON;
- 會話級別關(guān)閉查詢執(zhí)行信息收集功能:
SET queryprofile.enable = OFF;
- 開啟當(dāng)前庫的查詢執(zhí)行信息收集功能:
ALTER DATABASE <dbname> SET queryprofile.enable = ON;
如果需要實例級別開啟或關(guān)閉Query Profiling Statistics功能,請提交工單聯(lián)系技術(shù)支持進(jìn)行修改。
查看查詢執(zhí)行信息
開啟查詢執(zhí)行信息收集功能后,您可以通過查詢執(zhí)行信息提供的系統(tǒng)視圖查看運行中或歷史的查詢和執(zhí)行過程。
查詢執(zhí)行信息視圖
- queryprofile.query_exec_history:用于查看歷史查詢的信息。
- queryprofile.query_exec_status:用于查看正在運行的查詢的信息。
- queryprofile.node_exec_history:用于查看歷史查詢執(zhí)行過程信息。
- queryprofile.node_exec_status:用于查看正在運行的查詢執(zhí)行過程信息。
queryprofile.query_exec_history和queryprofile.query_exec_status視圖結(jié)構(gòu)一致,視圖中字段說明如下:
字段 | 類型 | 說明 |
---|---|---|
queryid | int8 | 查詢ID,即查詢的唯一標(biāo)識。 |
sessid | integer | 查詢所屬的會話ID。 |
commandid | integer | 查詢在其所屬會話中的編號。 |
starttime | timestamptz | 查詢開始的時間。 |
runtime | float8 | 查詢運行的總時間,單位為秒(s)。 |
stmt_text | text | 查詢對應(yīng)的SQL文本。 |
queryprofile.node_exec_history和queryprofile.node_exec_status視圖結(jié)構(gòu)一致,視圖中字段說明如下:
字段 | 類型 | 說明 |
---|---|---|
queryid | int8 | 算子所屬的查詢ID,即查詢的唯一標(biāo)識。 |
stmtid | int8 | 算子所屬查詢ID所對應(yīng)的SQL ID。 |
sessid | integer | 算子所屬的會話ID。 |
commandid | integer | 算子所屬的查詢在其會話中的編號ID。 |
nodeid | integer | 算子在查詢執(zhí)行計劃中的ID。 |
sliceid | integer | 算子在執(zhí)行計劃中所屬的Slice ID。 |
nodetypeid | integer | 算子類型ID。 |
nodename | text | 算子類型。 |
tuplesout | int8 | 算子執(zhí)行過程中輸出的數(shù)據(jù)行數(shù)。 |
tuplesin | int8 | 算子執(zhí)行過程中輸入的數(shù)據(jù)行數(shù)。 |
tuplesplan | int8 | 算子在執(zhí)行計劃中的輸入行數(shù)。 |
execmem | float8 | 執(zhí)行器分配給算子的內(nèi)存。 |
workmem | float8 | 算子工作占用內(nèi)存。 |
starttime | timestamptz | 算子開始執(zhí)行的時間。 |
endtime | timestamptz | 算子結(jié)束執(zhí)行的時間。 |
duration | float8 | 算子執(zhí)行消耗的時間,單位為秒(s)。
說明 該字段并非算子執(zhí)行開始結(jié)束執(zhí)行時間的間隔(可能包含下層算子執(zhí)行消耗的時間),而是該算子本身執(zhí)行所消耗的時間。
|
diskreadsize | int8 | 算子從磁盤讀取數(shù)據(jù)量。 |
diskreadtime | float8 | 算子從磁盤讀取數(shù)據(jù)消耗的時間,單位為秒(s)。 |
netiosize | int8 | 數(shù)據(jù)在不同節(jié)點間網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量。 |
netiotime | float8 | 數(shù)據(jù)在不同節(jié)點間網(wǎng)絡(luò)傳輸消耗的時間,單位為秒(s)。 |
queryprofile.node_exec_history和queryprofile.node_exec_status視圖中每一個查詢算子對應(yīng)一行數(shù)據(jù),其中記錄了查詢執(zhí)行過程中在該算子階段的基本執(zhí)行信息和消耗的資源,您可以根據(jù)視圖中的信息定位到執(zhí)行異常的階段,優(yōu)化查詢執(zhí)行過程。
查看正在運行的查詢執(zhí)行信息
示例1
查看正在運行的查詢,SQL如下:
SELECT * FROM queryprofile.query_exec_status;
示例2
查看正在運行的查詢執(zhí)行過程,SQL如下:
SELECT * FROM queryprofile.node_exec_status;
查看歷史的查詢執(zhí)行信息
示例1
查看歷史查詢,SQL如下:
SELECT * FROM queryprofile.query_exec_history;
示例2
查看歷史查詢執(zhí)行過程,SQL如下:
SELECT * FROM queryprofile.node_exec_history;
修改運行中查詢執(zhí)行信息視圖的更新頻率
AnalyticDB PostgreSQL版提供了queryprofile.refresh_interval參數(shù),用于控制queryprofile.query_exec_status和queryprofile.node_exec_status視圖的更新頻率,該參數(shù)值表示執(zhí)行過程中執(zhí)行算子每次更新統(tǒng)計數(shù)據(jù)所間隔的處理數(shù)據(jù)行數(shù)。
queryprofile.refresh_interval參數(shù)的默認(rèn)值為1000,表示算子每讀入1000行數(shù)據(jù)更新一次統(tǒng)計數(shù)據(jù);0表示關(guān)閉動態(tài)收集查詢執(zhí)行信息功能。
您可以通過如下SQL查看查詢執(zhí)行信息更新頻率:
SHOW queryprofile.refresh_interval;
返回示例如下:
queryprofile.refresh_interval
-------------------------------
1000
(1 row)
歷史查詢執(zhí)行信息回收
AnalyticDB PostgreSQL版提供了queryprofile.max_query_num和queryprofile.query_time_limit兩個參數(shù)用于控制歷史查詢信息回收:
- queryprofile.max_query_num:用于控制保留的最大記錄數(shù)。該參數(shù)值默認(rèn)為10000,即保存最近10000條歷史查詢信息。您可以通過如下SQL查看保留的最大記錄數(shù):
SHOW queryprofile.max_query_num;
- queryprofile.query_time_limit:用于清除記錄中的短查詢,總執(zhí)行時長低于設(shè)置閾值的查詢在查詢信息回收時會被優(yōu)先回收,單位為秒(s)。該參數(shù)值默認(rèn)為1,即總執(zhí)行時長小于1秒的查詢會優(yōu)先回收。您可以通過如下SQL查看保留最短查詢的時長:
SHOW queryprofile.query_time_limit;
例如,queryprofile.max_query_num的值為10000,queryprofile.query_time_limit的值為1時,表示查詢信息數(shù)量超過10000時會觸發(fā)查詢信息回收,查詢信息回收會優(yōu)先回收總執(zhí)行時長小于1s的查詢信息,如果記錄中已沒有總執(zhí)行時長小于1s的記錄,系統(tǒng)將會從最早的查詢信息開始回收。
使用示例
查詢執(zhí)行信息可用于排查與分析查詢執(zhí)行的異常狀態(tài)。當(dāng)查詢執(zhí)行信息收集處于打開狀態(tài)時,系統(tǒng)會收集所有查詢的執(zhí)行過程數(shù)據(jù),您可通過執(zhí)行過程數(shù)據(jù)獲得如下信息:
- 系統(tǒng)中慢SQL或正在執(zhí)行的查詢。
- 查詢執(zhí)行信息中包含的各個算子信息及其輸入或輸出行數(shù)。
- 查詢執(zhí)行過程中耗時多的算子。
- 單一算子執(zhí)行時占用的資源量,例如內(nèi)存,磁盤 I/O,網(wǎng)絡(luò) I/O。
操作步驟如下:
- 在當(dāng)前會話中開啟查詢執(zhí)行信息收集功能,SQL如下:
SET queryprofile.enable = ON;
- 查看歷史查詢執(zhí)行信息,此處以獲取最近10條歷史查詢執(zhí)行信息為例,SQL示例如下:
SELECT * FROM queryprofile.query_exec_history ORDER BY starttime DESC limit 10;
返回示例如下:
- 從以上返回結(jié)果中找到需要分析的查詢執(zhí)行信息,使用從queryprofile.query_exec_history視圖中獲取的queryid字段,在queryprofile.node_exec_history視圖中獲取該查詢的執(zhí)行過程,SQL示例如下:
SELECT * FROM queryprofile.node_exec_history WHERE queryid = 6902*********93;
返回示例如下:
從返回結(jié)果中可以看到算子名稱、耗時、輸入行數(shù)、輸出行數(shù)、占用資源等信息。您可根據(jù)表中結(jié)果對每一個算子的執(zhí)行記錄進(jìn)行分析,以定位和解決性能問題。