Postgres EXPLAIN ANALYZE 每个连接的第一个查询的计划时间很慢
Postgres EXPLAIN ANALYSE Planning Time slow for first query per connection
运行在psql
中第一次查询时,有点慢。第二次由于计划时间大幅下降,速度快了很多。
> EXPLAIN ANALYSE SELECT * FROM public.my_custom_function(10, 10, 'Personal');
第一次:
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
Function Scan on my_custom_function (cost=0.25..10.25 rows=1000 width=32) (actual time=4.900..4.901 rows=1 loops=1)
Planning Time: 30.870 ms
Execution Time: 3.410 ms
(3 rows)
所有后续查询:
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
Function Scan on my_custom_function (cost=0.25..10.25 rows=1000 width=32) (actual time=4.900..4.901 rows=1 loops=1)
Planning Time: 0.620 ms
Execution Time: 4.920 ms
(3 rows)
每当我与数据库建立新连接时都是这种情况,第一个调用需要相当长的计划时间,而其他所有都很好。
其他上下文
部署: Docker
Postgres 版本: 12
SQL 逻辑: 执行索引 JOIN 和 WHERE 查找。我知道那里的逻辑快速而可靠,需要优化的不是查询本身。
无论我 运行 查询本身还是通过函数,同样的计划时间问题仍然存在。
问题:
我有一个 HTTP API 为每个请求创建一个连接,调用函数一次然后返回。因此,每个 API 请求都具有非计划查询的性能。
问题:
我怎样才能让这个查询一次又一次地被计划?也许使用 PREPARE 语句?
虽然可能有一些方法可以加快速度(如果我们可以看到您的函数),但从根本上说,如果您对性能非常敏感,那么您需要选择一些不会为每个请求创建一个连接的技术。像 mod_perl 或 FastCGI 或者 pgbouncer。
运行在psql
中第一次查询时,有点慢。第二次由于计划时间大幅下降,速度快了很多。
> EXPLAIN ANALYSE SELECT * FROM public.my_custom_function(10, 10, 'Personal');
第一次:
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
Function Scan on my_custom_function (cost=0.25..10.25 rows=1000 width=32) (actual time=4.900..4.901 rows=1 loops=1)
Planning Time: 30.870 ms
Execution Time: 3.410 ms
(3 rows)
所有后续查询:
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
Function Scan on my_custom_function (cost=0.25..10.25 rows=1000 width=32) (actual time=4.900..4.901 rows=1 loops=1)
Planning Time: 0.620 ms
Execution Time: 4.920 ms
(3 rows)
每当我与数据库建立新连接时都是这种情况,第一个调用需要相当长的计划时间,而其他所有都很好。
其他上下文
部署: Docker
Postgres 版本: 12
SQL 逻辑: 执行索引 JOIN 和 WHERE 查找。我知道那里的逻辑快速而可靠,需要优化的不是查询本身。
无论我 运行 查询本身还是通过函数,同样的计划时间问题仍然存在。
问题:
我有一个 HTTP API 为每个请求创建一个连接,调用函数一次然后返回。因此,每个 API 请求都具有非计划查询的性能。
问题:
我怎样才能让这个查询一次又一次地被计划?也许使用 PREPARE 语句?
虽然可能有一些方法可以加快速度(如果我们可以看到您的函数),但从根本上说,如果您对性能非常敏感,那么您需要选择一些不会为每个请求创建一个连接的技术。像 mod_perl 或 FastCGI 或者 pgbouncer。