【发布时间】:2019-10-18 18:45:10
【问题描述】:
我有一个有趣的问题,我想对用户可以放置的优惠数量实施特定限制。报价保存在 postgresql(版本 10)数据库中,不应超过 1000。
我正在使用以下 sql 查询来检查用户有多少优惠并对照限制进行检查:
select count(*) from offers where offers.userId = 'b27e1d2f-c2c1-4d0b-8451-287013d7b716';
在性能指标中,我看到大部分时间都花在了这个查询上。因此我查了一下,发现:https://wiki.postgresql.org/wiki/Slow_Counting
PostgreSQL 仍然需要读取结果行以验证它们是否存在;
在查询规划器中可以看出,除了索引之外,只需要扫描一些堆提取,我认为这会减慢整个查询的速度:
Index Only Scan using offers_by_user_id_index on offers
Index Cond: (account_id = 'b27e1d2f-c2c1-4d0b-8451-287013d7b716'::uuid) | Heap Fetches: 650
- 有什么方法可以加快速度?
跟踪行数是加快检查速度的好方法吗?
感谢您的帮助!
编辑:UserId 是一个 UUID,并且 UUID 列上存在索引
【问题讨论】:
-
您应该在
userid上有一个索引,如果这是一个数字(int),您应该将它与一个数字进行比较,'1'是一个字符串常量,1是一个数字 -
其实userId是一个uuid并且存在索引,但是根据持久化offer的数量,统计的时间还是会增加很多。
-
请显示原始的完整执行计划(最好使用
explain (analyze, buffers)生成,而不是删除导入部分的精简版本(并且格式被搞砸了)
标签: sql postgresql performance