首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带Postgres的行缓存

带Postgres的行缓存
EN

Stack Overflow用户
提问于 2021-09-01 11:04:19
回答 2查看 275关注 0票数 1

作为Postgres的新手,我有一个关于缓存的问题。我不知道有多少是由数据库处理的,而不是我自己需要处理多少。

我有行是时间序列的一部分。举个例子,假设我每秒钟有1行。

我的查询是在滚动的基础上获得最后一分钟(60行)(从现在-1分钟到现在)。

理想情况下,我可以在客户机中缓存最后的结果并请求最后一秒钟。不幸的是,数据中有漏洞:一些行丢失了,几秒钟后我就被添加了。所以无论如何我都要质疑整件事。

我可以找到漏洞在哪里,并对这些进行查询,这也是一个选项。

我想知道的是: Postgres单独执行多少缓存?

如果我有一个返回第3、4、5、6行的查询,而我的下一个查询返回4、5、6、7,那么第4、5、6行是否必须再次被获取,或者它们是否被数据库缓存?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-01 12:12:22

Postgres包括一个广泛的缓存系统。同样的查询的后续执行很可能会使用缓存的数据,但是我们对它几乎没有影响,因为缓存是自主工作的。可以而且应该做的是使用预先准备好的声明。每文件:

准备好的语句是可用于优化性能的服务器端对象.执行准备语句时,将解析、分析和重写指定的语句。当随后发出EXECUTE命令时,计划并执行准备好的语句。这种分工避免了重复的解析分析工作,同时允许执行计划依赖于所提供的特定参数值。

但是,问题中描述的场景提出了一种完全不同的解决问题的方法,即使用NOTIFY / LISTEN特性。简单地说:

  • 每次将一行插入到表中时,服务器都会发送通知,
  • 应用程序在约定的通道上侦听并接收新输入的行。

在此解决方案中,应用程序只执行一次查询,并完成来自通知的数据。

样例触发功能:

代码语言:javascript
复制
create or replace function before_insert_on_my_table()
returns trigger language plpgsql as $$
begin
    perform pg_notify('my_data', new::text);
    return new;
end $$;

create trigger before_insert_on_my_table
before insert on my_table
for each row execute procedure before_insert_on_my_table();

应用程序中LISTEN语句的实现取决于所使用的语言。例如,python psycopg2有方便的工具。

在文档中阅读更多关于通知的信息。

票数 1
EN

Stack Overflow用户

发布于 2021-09-01 12:09:53

PostgreSQL自动缓存数据。数据以8kB为单位进行读取、写入和缓存,每当您访问一行时,包含该行的块将被缓存。

您只需确保表的时间戳上有一个索引,否则PostgreSQL必须读取整个表才能计算结果。使用索引,它将只读取(和缓存)包含所需数据的块,这将加快对这些数据的下一次查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69012558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档