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)而排查并分析異常問題。

說明 AnalyticDB PostgreSQL版內(nèi)核小版本需為V6.3.8.2及以上版本。升級版本具體操作,請參見版本升級。

開啟查詢執(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)
說明 若需要關(guān)閉動態(tài)收集查詢執(zhí)行信息功能或修改數(shù)據(jù)更新頻率,請提交工單聯(lián)系技術(shù)支持進(jìn)行修改。

歷史查詢執(zhí)行信息回收

AnalyticDB PostgreSQL版提供了queryprofile.max_query_numqueryprofile.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)將會從最早的查詢信息開始回收。

說明 若希望修改上述兩個系統(tǒng)參數(shù),請提交工單聯(lián)系技術(shù)支持進(jìn)行修改。

使用示例

查詢執(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。

操作步驟如下:

  1. 在當(dāng)前會話中開啟查詢執(zhí)行信息收集功能,SQL如下:
    SET queryprofile.enable = ON;
  2. 查看歷史查詢執(zhí)行信息,此處以獲取最近10條歷史查詢執(zhí)行信息為例,SQL示例如下:
    SELECT * FROM queryprofile.query_exec_history ORDER BY starttime DESC limit 10;

    返回示例如下:

    查詢執(zhí)行記錄-1
  3. 從以上返回結(jié)果中找到需要分析的查詢執(zhí)行信息,使用從queryprofile.query_exec_history視圖中獲取的queryid字段,在queryprofile.node_exec_history視圖中獲取該查詢的執(zhí)行過程,SQL示例如下:
    SELECT * FROM queryprofile.node_exec_history WHERE queryid = 6902*********93;

    返回示例如下:

    查詢執(zhí)行記錄-2

    從返回結(jié)果中可以看到算子名稱、耗時、輸入行數(shù)、輸出行數(shù)、占用資源等信息。您可根據(jù)表中結(jié)果對每一個算子的執(zhí)行記錄進(jìn)行分析,以定位和解決性能問題。