使用 PostgreSQL 管理暫存檔案 - Amazon Relational Database Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 PostgreSQL 管理暫存檔案

在 PostgreSQL 中,複雜的查詢可能會同時執行多個排序或雜湊操作,每個操作都使用執行個體記憶體將結果儲存到 work_mem 參數中指定的值。當執行個體記憶體不足時,會建立暫存檔來儲存結果。這些檔案會寫入磁碟以完成查詢執行。稍後,這些檔案會在查詢完成後自動移除。在 RDS for PostgreSQL 中,這些檔案會儲存在資料磁碟區上的 Amazon EBS 中。如需詳細資訊,請參閱 Amazon RDS 資料庫執行個體儲存體。您可以監控在 CloudWatch​ 中發佈的 FreeStorageSpace​ 指標,藉此確保資料庫執行個體有充足的可用儲存空間。如需詳細資訊,請參閱 FreeStorageSpace

對於涉及多個並行查詢的工作負載,我們建議使用 Amazon RDS AuroraOptimized Read Instancecluster以增加暫存檔案的使用量。這些執行個體使用本機非揮發性記憶體快速 (NVMe) 型固態硬碟 (SSD) 區塊層級儲存來放置暫存檔案。如需詳細資訊,請參閱使用 Amazon RDS Optimized Reads 改善 RDS for PostgreSQL 的查詢效能

您可以使用以下參數和函數來管理執行個體中的暫存檔案。

  • temp_file_limit – 此參數會取消任何超過 temp_file 大小的查詢 (以 KB 為單位)。此限制可防止任何查詢無休止地執行,並消耗含有暫存檔的磁碟空間。您可以使用 log_temp_files 參數的結果來估計值。最佳實務是檢查工作負載行為並根據估計值設定限制。以下範例顯示查詢超過限制時的取消方式。

    postgres=>select * from pgbench_accounts, pg_class, big_table;
    ERROR: temporary file size exceeds temp_file_limit (64kB)
  • log_temp_files – 此參數會在移除工作階段的暫存檔案時,將訊息傳送至 postgresql.log。這個參數會在查詢順利完成後產生日誌。因此,它可能無助於疑難排解使用中、長時間執行的查詢。

    下列範例顯示,當查詢順利完成時,這些項目會在清理暫存檔時記錄在 postgresql.log 檔案中。

    2023-02-06 23:48:35 UTC:205.251.233.182(12456):adminuser@postgres:[31236]:LOG: temporary file: path "base/pgsql_tmp/pgsql_tmp31236.5", size 140353536 2023-02-06 23:48:35 UTC:205.251.233.182(12456):adminuser@postgres:[31236]:STATEMENT: select a.aid from pgbench_accounts a, pgbench_accounts b where a.bid=b.bid order by a.bid limit 10; 2023-02-06 23:48:35 UTC:205.251.233.182(12456):adminuser@postgres:[31236]:LOG: temporary file: path "base/pgsql_tmp/pgsql_tmp31236.4", size 180428800 2023-02-06 23:48:35 UTC:205.251.233.182(12456):adminuser@postgres:[31236]:STATEMENT: select a.aid from pgbench_accounts a, pgbench_accounts b where a.bid=b.bid order by a.bid limit 10;
  • pg_ls_tmpdir – 此功能可從 RDS for PostgreSQL 13 及以上版本使用,提供目前暫存檔案使用情況的可見性。完成的查詢不會出現在函數的結果中。在下列範例中,您可以檢視此函數的結果。

    postgres=>select * from pg_ls_tmpdir();
    name | size | modification -----------------+------------+------------------------ pgsql_tmp8355.1 | 1072250880 | 2023-02-06 22:54:56+00 pgsql_tmp8351.0 | 1072250880 | 2023-02-06 22:54:43+00 pgsql_tmp8327.0 | 1072250880 | 2023-02-06 22:54:56+00 pgsql_tmp8351.1 | 703168512 | 2023-02-06 22:54:56+00 pgsql_tmp8355.0 | 1072250880 | 2023-02-06 22:54:00+00 pgsql_tmp8328.1 | 835031040 | 2023-02-06 22:54:56+00 pgsql_tmp8328.0 | 1072250880 | 2023-02-06 22:54:40+00 (7 rows)
    postgres=>select query from pg_stat_activity where pid = 8355; query ---------------------------------------------------------------------------------------- select a.aid from pgbench_accounts a, pgbench_accounts b where a.bid=b.bid order by a.bid (1 row)

    檔案名稱包含產生暫存檔之工作階段的處理 ID (PID)。較進階的查詢 (例如下列範例) 會針對每個 PID 執行暫存檔案的總和。

    postgres=>select replace(left(name, strpos(name, '.')-1),'pgsql_tmp','') as pid, count(*), sum(size) from pg_ls_tmpdir() group by pid;
    pid | count | sum ------+------------------- 8355 | 2 | 2144501760 8351 | 2 | 2090770432 8327 | 1 | 1072250880 8328 | 2 | 2144501760 (4 rows)
  • pg_stat_statements – 如果您啟動 pg_stat_statements 參數,則可以檢視每次呼叫的平均暫存檔案使用量。您可以識別查詢的 query_id,並使用它來檢查暫存檔的使用情況,如以下範例所示。

    postgres=>select queryid from pg_stat_statements where query like 'select a.aid from pgbench%';
    queryid ---------------------- -7170349228837045701 (1 row)
    postgres=>select queryid, substr(query,1,25), calls, temp_blks_read/calls temp_blks_read_per_call, temp_blks_written/calls temp_blks_written_per_call from pg_stat_statements where queryid = -7170349228837045701;
    queryid | substr | calls | temp_blks_read_per_call | temp_blks_written_per_call ----------------------+---------------------------+-------+-------------------------+---------------------------- -7170349228837045701 | select a.aid from pgbench | 50 | 239226 | 388678 (1 row)
  • Performance Insights – 在績效詳情儀表板中,您可以透過開啟指標 temp_bytestemp_files 來檢視暫存檔的使用情況。然後,您可以查看這兩個指標的平均值,並查看它們如何對應至查詢工作負載。績效詳情中的檢視不會明確顯示產生暫存檔的查詢。不過,當您將績效詳情與為 pg_ls_tmpdir 顯示的查詢結合使用時,您可以疑難排解、分析及判斷查詢工作負載中的變更。

    如需如何使用績效詳情分析指標和查詢的詳細資訊,請參閱使用績效詳情儀表板來分析指標

    如需使用績效詳情檢視暫存檔案用量的範例,請參閱 利用 Performance Insights 檢視暫存檔案使用情