使用查詢存放區監視效能

適用於:適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器

適用於 PostgreSQL 的 Azure 資料庫查詢存放區功能提供的方法可追蹤一段時間的查詢效能。 查詢存放區可協助您快速找到執行時間最長又最耗資源的查詢,簡化效能疑難排解。 查詢存放區會自動擷取查詢的歷程記錄和執行階段統計資料,並予以保留以供您檢閱。 它會依時間切分資料,以便您查看時態性使用模式。 所有使用者、資料庫及查詢的資料都會儲存在適用於 PostgreSQL 的 Azure 資料庫執行個體中名為 azure_sys 的資料庫。

重要

請勿修改 azure_sys 資料庫或其結構描述。 這樣做會造成查詢存放區與相關的效能功能無法正確運作。

啟用查詢存放區

查詢存放區是選擇加入的功能,因此依預設不會在伺服器上啟用。 查詢存放區是針對指定伺服器上的所有資料庫全域啟用或停用的,並無法個別開啟或關閉資料庫。

重要

請勿在高載定價層上啟用查詢存放區,因為這會造成效能影響。

使用 Azure 入口網站啟用查詢存放區

  1. 登入 Azure 入口網站,然後選取適用於 PostgreSQL 的 Azure 資料庫伺服器。
  2. 在功能表的 [設定] 區段中,選取 [伺服器參數]。
  3. 搜尋 pg_qs.query_capture_mode 參數。
  4. 將值設定為 TOPALL,然後儲存。 請等候 20 分鐘,以讓第一批資料保存在 azure_sys 資料庫中。 若要啟用查詢存放區中的等候統計資料:
  5. 搜尋 pgms_wait_sampling.query_capture_mode 參數。
  6. 將值設定為 ALL,然後選取 [儲存]。

查詢存放區中的資訊

查詢存放區有兩個存放區:

  • 執行階段統計資料存放區,用於保存查詢執行統計資料資訊。
  • 等候統計資料存放區,用於保存等候統計資料資訊。

使用查詢存放區的常見案例包括:

  • 判斷查詢在指定時間範圍內的執行次數
  • 跨時間範圍比較查詢的平均值行時間,查看大幅差異
  • 識別在過去幾小時中執行最久的查詢
  • 識別等候資源的前 N 項查詢
  • 了解特定查詢的等候性質。為了讓空間使用量降到最低,會經過一段固定且可設定的時間範圍,才彙總執行階段統計資料存放區的執行階段執行統計資料。 這些存放區中的資訊可以使用檢視來查詢。

存取查詢存放區資訊

查詢存放區資料會儲存在 Postgres 伺服器上的 azure_sys 資料庫中。 下列查詢會傳回查詢存放區中的相關資訊:


SELECT * FROM  query_store.qs_view;

或者,此查詢可取得等候統計資料:


SELECT * FROM  query_store.pgms_wait_sampling_view;

尋找等候查詢

等候事件類型會依相似性,將不同的等候事件結合成貯體。 查詢存放區提供等候事件類型、特定的等候事件名稱,以及有問題的查詢。 能夠將此等候資訊與查詢執行階段相互關聯,表示您可以更深入了解查詢效能特性從何而來。

以下是如何查詢存放區中的等候統計資料,以更多深入了解工作負載的一些範例:

觀測 動作
高鎖定等候數 查看受影響查詢的查詢文字,並找出目標實體。 查看查詢存放區,針對經常執行和/或持續時間很長的實體,尋找修改同一實體的其他查詢。 找出這些查詢之後,請考慮變更應用程式邏輯,改善並行存取,或使用限制較少的隔離等級。
高緩衝區 IO 等候數 在查詢存放區中尋找實體讀取次數高的查詢。 如果與高 IO 等候數的查詢相符,請考慮對基礎實體引進索引,以執行搜尋,而不是掃描。 這可將查詢的 IO 額外負荷降到最低。 請在入口網站檢查伺服器的效能建議,以查看是否有此伺服器的索引建議,可供將查詢最佳化。
高記憶體等候數 找出查詢存放區中記憶體耗用量名列前茅的查詢。 這些查詢可能會進一步延遲受影響查詢的進度。 請在入口網站檢查伺服器的效能建議,以查看是否有索引建議,可供將這些查詢最佳化。

設定選項

啟用查詢存放區時,會以每 15 分鐘的彙總時間範圍儲存資料一次,每個範圍內最多可有 500 個相異的查詢。 下列選項可用於設定查詢存放區參數。

參數 說明 預設值 Range
pg_qs.query_capture_mode 設定追蹤哪些陳述式。 none、top、all
pg_qs.store_query_plans 為 pg_qs 開啟或關閉儲存查詢計劃的功能 on、off
pg_qs.max_plan_size 設定要為 pg_qs 的查詢計劃文字儲存的位元組數上限;較長的計劃將會截斷。 7500 100 - 10k
pg_qs.max_query_text_length 設定可以儲存的最大查詢長度。 較長的查詢會遭截斷。 6000 100 - 10K
pg_qs.retention_period_in_days 設定保留期限。 7 1 - 30
pg_qs.index_generation_interval 設定啟用查詢存放區時,所有資料庫的索引建議產生頻率。 15 15 - 10080
pg_qs.track_utility 設定是否要追蹤公用程式命令 on on、off

下列選項特別適用於等候統計資料。

參數 說明 預設值 Range
pgms_wait_sampling.query_capture_mode 設定追蹤等候統計資料的哪些陳述式。 none、all
Pgms_wait_sampling.history_period 設定以毫秒為單位的等候事件取樣頻率。 100 1-600000

[!NOTE] pg_qs.query_capture_mode supersedes pgms_wait_sampling.query_capture_mode. 若 pg_qs.query_capture_mode 是 NONE,則 pgms_wait_sampling.query_capture_mode 設定沒有影響。

使用 Azure 入口網站為參數取得或設定不同的值。

檢視和函式

使用下列檢視和函式來檢視和管理查詢存放區。 PostgreSQL 公用角色中的任何人都可以使用這些檢視,查看查詢存放區中的資料。 這些檢視僅適用於 azure_sys 資料庫。 移除常值和常數之後,查看查詢結構,其會呈現標準化。 如果兩個查詢完全相同 (但常值除外),則兩者會有相同的 queryId。

query_store.qs_view

此檢視會傳回查詢存放區中的所有資料。 不同的資料庫識別碼、使用者識別碼及查詢識別碼都會自成一資料列。

名稱 型別 參考 說明
runtime_stats_entry_id BIGINT 來自 runtime_stats_entries 資料表的識別碼
user_id oid pg_authid.oid 執行陳述式的使用者物件識別 (OID)
db_id oid pg_database.oid 在其中執行陳述式的資料庫物件識別 (OID)
query_id BIGINT 從陳述式的剖析樹狀結構計算的內部雜湊碼
query_sql_text Varchar(10000) 代表性陳述式的文字。 結構相同的不同查詢會群集在一起;此文字就式叢集中第一個查詢的文字。
plan_id BIGINT 對應至此查詢的計畫識別碼
start_time timestamp 依時間貯體彙總的查詢 - 根據預設,貯體的時間範圍為 15 分鐘。 這是和此查詢的時間貯體對應的開始時間。
end_time timestamp 和此查詢的時間貯體對應的結束時間。
calls BIGINT 查詢執行的次數
total_time 雙精度 查詢總執行時間 (以毫秒為單位)
min_time 雙精度 查詢最短執行時間 (以毫秒為單位)
max_time 雙精度 查詢最長執行時間 (以毫秒為單位)
mean_time 雙精度 查詢平均執行時間 (以毫秒為單位)
stddev_time 雙精度 查詢執行時間標準差 (以毫秒為單位)
rows BIGINT 由陳述式擷取或受其影響的資料列總數
shared_blks_hit BIGINT 依據陳述式的共用區塊快取點擊總次數
shared_blks_read BIGINT 由陳述式讀取的共用區塊總數
shared_blks_dirtied BIGINT 由陳述式變動的共用區塊總數
shared_blks_written BIGINT 由陳述式寫入的共用區塊總數
local_blks_hit BIGINT 依據陳述式的本機區塊快取點擊總次數
local_blks_read BIGINT 由陳述式讀取的本機區塊總數
local_blks_dirtied BIGINT 由陳述式變動的本機區塊總數
local_blks_written BIGINT 由陳述式寫入的本機區塊總數
temp_blks_read BIGINT 由陳述式讀取的暫存區塊總數
temp_blks_written BIGINT 由陳述式寫入的暫存區塊總數
blk_read_time 雙精度 陳述式讀取區塊花費的總時間 (以毫秒為單位) (若已啟用 track_io_timing 的話,否則為零)
blk_write_time 雙精度 陳述式寫入區塊花費的總時間 (以毫秒為單位) (若已啟用 track_io_timing,否則為零)

query_store.query_texts_view

此檢視會傳回查詢存放區中的查詢文字資料。 不同的 query_text 都會自成一資料列。

名稱 類型 說明
query_text_id BIGINT query_texts 資料表識別碼
query_sql_text Varchar(10000) 代表性陳述式的文字。 結構相同的不同查詢會群集在一起;此文字就式叢集中第一個查詢的文字。

query_store.pgms_wait_sampling_view

此檢視會傳回查詢存放區中的等候事件資料。 不同的資料庫識別碼、使用者識別碼、查詢識別碼及事件都會自成一資料列。

名稱 型別 參考 說明
user_id oid pg_authid.oid 執行陳述式的使用者物件識別 (OID)
db_id oid pg_database.oid 在其中執行陳述式的資料庫物件識別 (OID)
query_id BIGINT 從陳述式的剖析樹狀結構計算的內部雜湊碼
event_type text 後端等候中事件的類型
event text 如果後端目前正在等候,為該等候事件的名稱
calls 整數 擷取到相同事件的次數

query_store.query_plans_view

此檢視會傳回用來執行查詢的查詢計劃。 每個不同的資料庫識別碼及查詢識別碼,都會自成一個資料列。 這只會儲存非公用程式查詢的查詢計劃。

plan_id db_id query_id plan_text
plan_id BIGINT 來自 query_text 的雜湊值
db_id oid pg_database.oid 在其中執行陳述式的資料庫物件識別 (OID)
query_id BIGINT 從陳述式的剖析樹狀結構計算的內部雜湊碼
plan_text varchar(10000) 陳述式在 costs=false、buffers=false 且 format=false 時的執行計畫。 這是由 EXPLAIN 提供的相同輸出。

函式

qs_reset 捨棄查詢存放區至今收集到的所有統計資料。 只有伺服器管理員角色可以執行此函式。

staging_data_reset 捨棄查詢存放區在記憶體中收集的統計資料 (亦即,記憶體中的資料尚未排清至資料庫)。 只有伺服器管理員角色可以執行此函式。

限制與已知問題

  • 如果 PostgreSQL 伺服器開啟了 default_transaction_read_only 參數,查詢存放區將不會擷取任何資料。

下一步