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 文章
频道条目
分享
文章归档