本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 PostgreSQL 管理暫存檔案
在 PostgreSQL 中,複雜的查詢可能會同時執行多個排序或雜湊操作,每個操作都使用執行個體記憶體將結果儲存到 work_mem
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_bytes 和 temp_files 來檢視暫存檔的使用情況。然後,您可以查看這兩個指標的平均值,並查看它們如何對應至查詢工作負載。績效詳情中的檢視不會明確顯示產生暫存檔的查詢。不過,當您將績效詳情與為pg_ls_tmpdir
顯示的查詢結合使用時,您可以疑難排解、分析及判斷查詢工作負載中的變更。如需如何使用績效詳情分析指標和查詢的詳細資訊,請參閱使用績效詳情儀表板來分析指標。
如需使用績效詳情檢視暫存檔案用量的範例,請參閱 利用 Performance Insights 檢視暫存檔案使用情