PostgREST JSON 字段序列化性能
PostgREST JSON field serialisation performance
在 Postgres 中,我有一个 table,我 运行 一个函数,returns 最高结果。此函数需要大约 2 毫秒才能完成,而无需缓存数据,这正是我所需要的。
然后我将 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;
这看起来像是网络问题。您自己说过,该函数是 运行 从 DB 中有效地获取的。
计算机 运行 curl
和为 Rest API 服务的计算机之间的网络延迟似乎很高。
或者它可能与网络带宽有关,如果 jsonb
列很大。
您正在将查询速度(在您的 postgresql 客户端中)与“查询速度 + 数据库连接时间”进行比较。也就是说,当您执行 curl 请求时,除了 运行 查询之外,postgrest 还需要连接到数据库,这需要时间。默认情况下,连接会在 10 秒后关闭(查看 db-pool-timeout)。所以这就是为什么你第一次调用很慢,而第二次调用很快的原因(与查询缓存计划无关)。如果你发出 curl 请求(第一个)它会很慢,第二个(如果立即发出)会很快,然后等待 10-15 秒并发出第三个,你会发现它会再次变慢(因为数据库连接已关闭)。
你想要的是将 db-pool-timeout 调整为 30m 这样你的所有调用都会很快(第一个除外)
在 Postgres 中,我有一个 table,我 运行 一个函数,returns 最高结果。此函数需要大约 2 毫秒才能完成,而无需缓存数据,这正是我所需要的。
然后我将 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;
这看起来像是网络问题。您自己说过,该函数是 运行 从 DB 中有效地获取的。
计算机 运行 curl
和为 Rest API 服务的计算机之间的网络延迟似乎很高。
或者它可能与网络带宽有关,如果 jsonb
列很大。
您正在将查询速度(在您的 postgresql 客户端中)与“查询速度 + 数据库连接时间”进行比较。也就是说,当您执行 curl 请求时,除了 运行 查询之外,postgrest 还需要连接到数据库,这需要时间。默认情况下,连接会在 10 秒后关闭(查看 db-pool-timeout)。所以这就是为什么你第一次调用很慢,而第二次调用很快的原因(与查询缓存计划无关)。如果你发出 curl 请求(第一个)它会很慢,第二个(如果立即发出)会很快,然后等待 10-15 秒并发出第三个,你会发现它会再次变慢(因为数据库连接已关闭)。 你想要的是将 db-pool-timeout 调整为 30m 这样你的所有调用都会很快(第一个除外)