AnalyticDB PostgreSQL版提供了查詢執行資訊收集(Query Profiling Statistics)功能,開啟該功能後,系統會自動收集並記錄查詢執行過程的統計資訊,您可以通過系統檢視表瀏覽並檢查執行較慢的SQL查詢語句。
在AnalyticDB PostgreSQL版中,查詢的執行過程被分解為多個運算元並依次執行。在特定情況下,為了排查與分析查詢執行的異常狀態,需要查看查詢執行過程的細節資料,例如某一特定運算元執行過程消耗的時間,輸入輸出的行數,佔用的資源(記憶體,I/O)等。AnalyticDB PostgreSQL版支援查詢執行細節資訊收集和記錄,通過查詢中各個運算元的執行記錄,您可以發現執行過程中存在的問題,進而排查並分析異常問題。
開啟查詢執行資訊收集功能
預設情況下,查詢執行資訊收集功能處於關閉狀態,您可以通過queryprofile.enable參數開啟或關閉該功能。
- 查看當前查詢執行資訊收集狀態:
SHOW queryprofile.enable; - 會話層級開啟查詢執行資訊收集功能:
SET queryprofile.enable = ON; - 會話層級關閉查詢執行資訊收集功能:
SET queryprofile.enable = OFF; - 開啟當前庫的查詢執行資訊收集功能:
ALTER DATABASE <dbname> SET queryprofile.enable = ON;
查看查詢執行資訊
開啟查詢執行資訊收集功能後,您可以通過查詢執行資訊提供的系統檢視表查看運行中或歷史的查詢和執行過程。
查詢執行資訊視圖
- queryprofile.query_exec_history:用於查看歷史查詢的資訊。
- queryprofile.query_exec_status:用於查看正在啟動並執行查詢的資訊。
- queryprofile.node_exec_history:用於查看歷史查詢執行過程資訊。
- queryprofile.node_exec_status:用於查看正在啟動並執行查詢執行過程資訊。
queryprofile.query_exec_history和queryprofile.query_exec_status視圖結構一致,視圖中欄位說明如下:
| 欄位 | 類型 | 說明 |
| queryid | int8 | 查詢ID,即查詢的唯一標識。 |
| sessid | integer | 查詢所屬的會話ID。 |
| commandid | integer | 查詢在其所屬會話中的編號。 |
| starttime | timestamptz | 查詢開始的時間。 |
| runtime | float8 | 查詢啟動並執行總時間,單位為秒(s)。 |
| stmt_text | text | 查詢對應的SQL文本。 |
queryprofile.node_exec_history和queryprofile.node_exec_status視圖結構一致,視圖中欄位說明如下:
| 欄位 | 類型 | 說明 |
| queryid | int8 | 運算元所屬的查詢ID,即查詢的唯一標識。 |
| stmtid | int8 | 運算元所屬查詢ID所對應的SQL ID。 |
| sessid | integer | 運算元所屬的會話ID。 |
| commandid | integer | 運算元所屬的查詢在其會話中的編號ID。 |
| nodeid | integer | 運算元在查詢執行計畫中的ID。 |
| sliceid | integer | 運算元在執行計畫中所屬的Slice ID。 |
| nodetypeid | integer | 運算元類型ID。 |
| nodename | text | 運算元類型。 |
| tuplesout | int8 | 運算元執行過程中輸出的資料行數。 |
| tuplesin | int8 | 運算元執行過程中輸入的資料行數。 |
| tuplesplan | int8 | 運算元在執行計畫中的輸入行數。 |
| execmem | float8 | 執行器分配給運算元的記憶體。 |
| workmem | float8 | 運算元工作佔用記憶體。 |
| starttime | timestamptz | 運算元開始執行的時間。 |
| endtime | timestamptz | 運算元結束執行的時間。 |
| duration | float8 | 運算元執行消耗的時間,單位為秒(s)。 說明 該欄位並非運算元執行開始結束執行時間的間隔(可能包含下層運算元執行消耗的時間),而是該運算元本身執行所消耗的時間。 |
| diskreadsize | int8 | 運算元從磁碟讀取資料量。 |
| diskreadtime | float8 | 運算元從磁碟讀取資料消耗的時間,單位為秒(s)。 |
| netiosize | int8 | 資料在不同節點間網路傳輸的資料量。 |
| netiotime | float8 | 資料在不同節點間網路傳輸消耗的時間,單位為秒(s)。 |
queryprofile.node_exec_history和queryprofile.node_exec_status視圖中每一個查詢運算元對應一行資料,其中記錄了查詢執行過程中在該運算元階段的基本執行資訊和消耗的資源,您可以根據視圖中的資訊定位到執行異常的階段,最佳化查詢執行過程。
查看正在啟動並執行查詢執行資訊
樣本1
查看正在啟動並執行查詢,SQL如下:
SELECT * FROM queryprofile.query_exec_status;樣本2
查看正在啟動並執行查詢執行過程,SQL如下:
SELECT * FROM queryprofile.node_exec_status;查看歷史的查詢執行資訊
樣本1
查看歷史查詢,SQL如下:
SELECT * FROM queryprofile.query_exec_history;樣本2
查看歷史查詢執行過程,SQL如下:
SELECT * FROM queryprofile.node_exec_history;修改運行中查詢執行資訊視圖的更新頻率
AnalyticDB PostgreSQL版提供了queryprofile.refresh_interval參數,用於控制queryprofile.query_exec_status和queryprofile.node_exec_status視圖的更新頻率,該參數值表示執行過程中執行運算元每次更新統計資料所間隔的處理資料行數。
queryprofile.refresh_interval參數的預設值為1000,表示運算元每讀入1000行資料更新一次統計資料;0表示關閉動態收集查詢執行資訊功能。
您可以通過如下SQL查看查詢執行資訊更新頻率:
SHOW queryprofile.refresh_interval;返回樣本如下:
queryprofile.refresh_interval
-------------------------------
1000
(1 row)歷史查詢執行資訊回收
AnalyticDB PostgreSQL版提供了queryprofile.max_query_num和queryprofile.query_time_limit兩個參數用於控制歷史查詢資訊回收:
- queryprofile.max_query_num:用於控制保留的最大記錄數。該參數值預設為10000,即儲存最近10000條歷史查詢資訊。您可以通過如下SQL查看保留的最大記錄數:
SHOW queryprofile.max_query_num; - queryprofile.query_time_limit:用於清除記錄中的短查詢,總執行時間長度低於設定閾值的查詢在查詢資訊回收時會被優先回收,單位為秒(s)。該參數值預設為1,即總執行時間長度小於1秒的查詢會優先回收。您可以通過如下SQL查看保留最短查詢的時間長度:
SHOW queryprofile.query_time_limit;
例如,queryprofile.max_query_num的值為10000,queryprofile.query_time_limit的值為1時,表示查詢資訊數量超過10000時會觸發查詢資訊回收,查詢資訊回收會優先回收總執行時間長度小於1s的查詢資訊,如果記錄中已沒有總執行時間長度小於1s的記錄,系統將會從最早的查詢資訊開始回收。
使用樣本
查詢執行資訊可用於排查與分析查詢執行的異常狀態。當查詢執行資訊收集處於開啟狀態時,系統會收集所有查詢的執行過程資料,您可通過執行過程資料獲得如下資訊:
- 系統中慢SQL或正在執行的查詢。
- 查詢執行資訊中包含的各個運算元資訊及其輸入或輸出行數。
- 查詢執行過程中耗時多的運算元。
- 單一運算元執行時佔用的資源量,例如記憶體,磁碟 I/O,網路 I/O。
操作步驟如下:
- 在當前會話中開啟查詢執行資訊收集功能,SQL如下:
SET queryprofile.enable = ON; - 查看歷史查詢執行資訊,此處以擷取最近10條歷史查詢執行資訊為例,SQL樣本如下:
SELECT * FROM queryprofile.query_exec_history ORDER BY starttime DESC limit 10;返回樣本如下:

- 從以上返回結果中找到需要分析的查詢執行資訊,使用從queryprofile.query_exec_history視圖中擷取的queryid欄位,在queryprofile.node_exec_history視圖中擷取該查詢的執行過程,SQL樣本如下:
SELECT * FROM queryprofile.node_exec_history WHERE queryid = 6902*********93;返回樣本如下:

從返回結果中可以看到運算元名稱、耗時、輸入行數、輸出行數、佔用資源等資訊。您可根據表中結果對每一個運算元的執行記錄進行分析,以定位和解決效能問題。