Navicat 部落格

在 PostgreSQL 中設定查詢逾時 2023 年 5 月 5 日,由 Robert Gravelle 撰寫

Navicat Monitor 3 的查詢分析器畫面頂部,有一個圖表顯示等候時間最長的查詢:

Screenshot_Navicat_Monitor_LongRunningQueries (102K)

識別落後的查詢非常重要,因為它們可以讓一切陷入癱瘓。

除了在識別出緩慢查詢查詢後修復它之外,另一種策略就是全面限制查詢執行時間。在一些專業級資料庫(例如 PostgreSQL)中,可以透過 statement_timeout 變數設定整個資料庫甚至每個使用者的查詢執行時間上限。本文將學習如何在 Navicat 16 For PostgreSQL 中運用這個重要的資料庫變數。

在資料庫層級設定 statement_timeout 變數

為資料庫設定預設陳述式逾時是一個很好的起點。這可確保連線到資料庫的任何應用程式或人員的查詢執行時間都不會超時。一個合理的預設值應是 30 秒或 60 秒,但如果你願意,可以設定更長的時間。以下是將值設定為 60 秒的陳述式:

ALTER DATABASE mydatabase SET statement_timeout = '60s';

Navicat 16 For PostgreSQL 中,我們可以選擇主功能表中的「工具」>「伺服器監控」>「PostgreSQL」來檢視 statement_timeout 變數。你會在「變數」索引標籤找到它:

statement_timeout_variable (75K)

事實上,因為伺服器有很多變數,你可能要使用尋找工具來找出 statement_timeout 變數!你可以按一下「全部突顯」切換按鈕以更有效地找到相符的變數。

當然,SHOW 陳述式也能做到:

show_statement (9K)

為特定使用者設定查詢逾時

為了更精確控制,我們可以為特定使用者設定查詢逾時值(你要知道總是會有人選取整個資料庫!)。這能使用 ALTER ROLE 陳述式做到,它可以設定許多資料庫變數,包括 statement_timeout。

我們就嘗試建立一個名為「guest」的新使用者角色:

guest_role (42K)

現在我們使用 ALTER ROLE 陳述式來限制查詢執行時間,如下所示:

ALTER ROLE guest SET statement_timeout='5min';

我們可以查詢 pg_roles 資料表來取得有關 statement_timeout 的資訊(包括它是如何設定的):

select_rolconfig (33K)

rolconfig 值是一個陣列,因此我們可以使用 unnest 取消巢狀,那麼一列會顯示一個設定:

select_rolconfig_unnest (20K)

關於在 PostgreSQL 中設定查詢逾時的結語

能夠識別落後的查詢是非常重要的,因為它們可以使你的資料庫效能陷入癱瘓。為此,Navicat Monitor 3 的查詢分析器畫面頂部有一個費時查詢圖表。

另一種方法是限制查詢在逾時之前可以執行多久。正如在本文中提到,可以在 PostgreSQL 的資料庫、階段作業甚至單一使用者層級設定查詢逾時。

如果你還未設定 statement_timeout 變數,我建議你盡快設定。這只是適當資料庫調整的其中一環,有助於確保你的資料庫執行個體保持良好狀況和可供使用。

有興趣試用 Navicat 16 For PostgreSQL 嗎?你可以在 這裡 下載全功能的應用程式,免費試用 14 天!

Navicat 文章
頻道記錄
分享
部落格封存檔