postgresql 计算查询特定数据库表条目的次数?

zyfwsgd6  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(4)|浏览(286)

我需要跟踪每个表条目被查询的次数,以便确定它们的受欢迎程度并最终按该值排序。
如果它使它更容易,我使用symfony与学说捆绑。
到目前为止,所有的搜索只涉及表中记录的计数,当搜索表条目的命中计数时。到目前为止还没有找到任何东西。
我还没有尝试过这个,但我正在寻找的是比改变我的查询操作和调用每个返回结果的另一个更新查询来增加命中计数更有效、更快速、更容易的东西。
我希望每个数据库表记录之前都有查询次数

eanckbw9

eanckbw91#

您必须自己计算访问次数,因为PostgreSQL不会跟踪此类信息。
您可以添加一个初始化为0的counter列,并进行如下查询:

UPDATE mytab
SET counter = counter + 1
WHERE ...
RETURNING *;

这是一个原子操作,不会出现争用情况,但是如果您一次选择多行,则可能会遇到死锁。
由于频繁的更新是PostgreSQL的杀手,请确保您获得HOT更新:

  • 创建fillfactor明显小于100的表,以便每个块中都有可用空间。
  • 不要在counter上放置索引。
bweufnob

bweufnob2#

可以使用v$sqlstats。因此如果查询为

select 10 from dual;

然后,要计算执行次数,可以使用以下查询

select executions 
  from v$sqlstats 
 where lower(sql_text) like 'select 10 from dual';
sg24os4d

sg24os4d3#

只是使用了一个计数器字段,并在每次查询时递增。

11dmarpk

11dmarpk4#

Postgres统计信息收集器可能会对您有所帮助。由于开销较大,默认情况下不会启用它,因此要启用它,您需要编辑/etc/postgresql//main中的postgres.conf
搜索“Statistics”(统计数据),您将找到以下部分

#------------------------------------------------------------------------------
# STATISTICS
#------------------------------------------------------------------------------

# - Query and Index Statistics Collector -

#track_activities = on
#track_activity_query_size = 1024   # (change requires restart)
#track_counts = on
#track_io_timing = off
#track_wal_io_timing = off
#track_functions = none         # none, pl, all
#stats_temp_directory = '/var/run/postgresql/14-main.pg_stat_tmp'

取消注解此部分,然后运行sudo systemctl restart postgresql
然后,除了Statistics Collector文档中概述的其他功能外,您还可以运行以下命令来查看各种统计信息

SELECT * from pg_stat_user_tables;

postgres.conf中所需变更的文档:https://www.postgresql.org/docs/9.1/runtime-config-statistics.html
使用统计信息收集器的文档:https://www.postgresql.org/docs/9.1/monitoring-stats.html

相关问题