sql - 对每个 UserId 实施限制的最快方法
问题描述
我有一个有趣的问题,我想对用户可以放置多少优惠实施特定限制。报价保存在 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 列上存在索引
解决方案
堆提取的数量表明该表没有足够频繁地被清理。如果您手动 VACUUM 它,这会加快速度吗?
推荐阅读
- node.js - 无法使用 zlib 模块解压缩压缩文件
- python - 在 Bernoulli NB 用于分类特征和 Gaussian NB 用于数值特征的一个数据集上实现混合朴素贝叶斯
- sql - 识别实体之间的关系
- sql - SQL - 部分根据另一个表选择行
- reactjs - Reactjs中的自动递减文本区域
- vb.net - 如何删除处理程序事件?
- php - PHP 警告:PHP 启动:无法加载动态库“session.so”
- python - 如何在 Python 中引发 JSONDecodeError
- scala - 火花列“子字符串”在其他列(行)中存在时替换
- node.js - 即使通过身份验证,也无法使用 SASL_SSL 和 Kerberos 使用消息