postgresql - PostgREST JSON 字段序列化性能
问题描述
在 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;
解决方案
您正在将查询速度(在您的 postgresql 客户端中)与“查询速度 + 数据库连接时间”进行比较。即当你做你的curl请求时,除了运行查询,postgrest还需要连接数据库,这需要时间。默认情况下,连接会在 10 秒后关闭(查看 db-pool-timeout)。所以这就是为什么你的第一个调用很慢,而第二个调用很快(与查询缓存计划无关)的原因。如果你发出 curl 请求(第一个)它会很慢,第二个(如果立即发出)它会很快,然后等待 10-15 秒并发出第三个,你会发现它又会变慢(因为数据库连接已关闭)。您想要的是将 db-pool-timeout 调整为 30m,您的所有调用都会很快(第一个除外)
推荐阅读
- javascript - 如何知道 rxjs webSocket 中是否建立了连接?
- swift - 为什么我的@State 没有改变我的条件语句?
- python-3.x - Python3:如何检测 /dev/shm(或 ProcessPoolPexecutor)是否可以使用?
- c++ - 向量的复制构造函数
C++ - javascript - React-Native/Firestore - 按日期搜索
- c++ - 在OpenGL中掩盖地形表面的一个区域
- flutter - Flutter:如何让尾随图标随 largeTitle 移动?
- javascript - 使用 jsonpath 提取 json 中的元素值
- reference - 参考文献没有出现在我的 Latex 书的 PDF 文件中
- powershell - 如何在 PowerShell 中列出具有长路径名的特定扩展名的文件而无需等待数小时