【问题标题】:PostgREST JSON field serialisation performancePostgREST JSON 字段序列化性能
【发布时间】:2020-06-30 12:03:09
【问题描述】:

在 Postgres 中,我有一个表,我运行一个函数来返回最高结果。这个函数大约需要 2ms 才能完成,没有缓存数据,这是我所需要的。

然后我将 PostgREST 加入其中,因为我需要一个允许服务运行此函数并使用其结果的 HTTP API。

当我对 PostgREST API 进行 curl 时,我得到 0.29 秒的响应时间,这是 290 毫秒,而且慢得离谱

是什么让 PostgREST 这么慢?

设置

Postgres 12 和 PostgREST 7.0.1 在同一台机器上运行,我的请求来自同一台机器,因此网络延迟应该很小。

代码

curl -d rating_min=5 -d rating_max=8 http://localhost:7045/rpc/get_json_data -w " %{time_starttransfer}\n"
> [{"json": {"name": "Friend"} }] 0.291
CREATE TABLE my_json_data (
    "json" jsonb NULL,
    mtime timestamp NULL,
    rating float8 NULL
);
CREATE OR REPLACE FUNCTION get_json_data(rating_min float, rating_max float)
RETURNS TABLE(
    "json" jsonb    
) AS
$$
SELECT "json"
FROM my_json_data
WHERE rating BETWEEN rating_min and rating_max
ORDER BY rating
LIMIT 1
$$ LANGUAGE SQL IMMUTABLE;

【问题讨论】:

  • 仅供参考 - 您的函数需要返回 jsonb 而不是 json。写的会创建失败,抛出error: pq: 42P13: return type mismatch in function declared to return json
  • 谢谢比尔,修正了那个错字
  • Hmm...the docs 仅声称“在 Heroku 免费套餐上,响应时间高达 2000 个请求/秒的亚秒响应时间”。
  • 让我看看; 1) 向服务器发送请求。 2) 处理请求 3) 查询数据库并返回结果 4) 发回响应。我认为你需要打破延迟蔓延的地方。
  • @BillJetzer 不幸的是,我无法将其部署到 Heroku,因为他们在非洲没有任何地区。在性能方面,每秒 2000 个请求意味着响应时间为 0.5 毫秒。所以理论上我所看到的不应该发生。

标签: postgresql postgrest


【解决方案1】:

您正在将查询速度(在您的 postgresql 客户端中)与“查询速度 + 数据库连接时间”进行比较。即当您执行 curl 请求时,除了运行查询之外,postgrest 还需要连接到数据库,这需要时间。默认情况下,连接会在 10 秒后关闭(查看 db-pool-timeout)。所以这就是为什么你的第一个调用很慢,而第二个调用很快(与查询缓存计划无关)的原因。如果你发出一个 curl 请求(第一个)它会很慢,第二个(如果立即发出)它会很快,然后等待 10-15 秒并发出第三个,你会发现它会再次变慢(因为数据库连接已关闭)。 您想要的是将 db-pool-timeout 调整为 30m,您的所有调用都会很快(第一个除外)

【讨论】:

  • 但是如果 pg + pgrst 在同一台机器上,重新连接应该需要 3-5ms。 +280 毫秒看起来有点多。
  • 更改 db-pool-timeout 确实是一个很大的性能提升!由于我每秒执行数千个查询,这产生了巨大的差异!
【解决方案2】:

这看起来像是网络问题。您自己说该功能在数据库中有效运行。 似乎运行 curl 的计算机和服务于 Rest API 的计算机之间的网络延迟很高。 或者可能与网络带宽有关,如果jsonb 列很大。

【讨论】:

  • 谢谢@Jonathan。我在我自己的计算机上将 Postgres 和 PostgREST 服务器作为容器运行在同一个 docker-compose 堆栈中,因此网络延迟应该不是问题。
  • @Werner 第二次 API 调用需要的时间是否更少?
  • 确实如此,但这是由于 Postgres 缓存了查询计划。第二个数据库调用也更快。总请求时间和db执行时间的差别还是一样的
  • @Werner 查询计划不应超过几毫秒
  • 没错。所以我的 Postgres 查询非常快,但问题仍然是 PostgREST 很慢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
相关资源
最近更新 更多