如何解决我可以从一个简单的查询中获得什么性能:简单的例子很慢
我使用的是由外部公司托管的 PostgreSQL 数据库。查询速度比我预期的要慢得多,我需要帮助才能理解。
Case:我有一个表,比如 MainTable,大约有 15.000.000 行。该表有 7 列类型:
(整数、整数、整数、日期时间、日期时间、日期时间、浮点数)。
主键由前两个整数列组成,称为GroupId 和ValueId。我经常需要从单个组中提取所有数据。例如:
SELECT * FROM MainTable WHERE GroupId = 23.
MainTable 大约有 50 个组,每个组包含大约 15000000/50 = 300,000 个条目。
我担心的是,上面的选择查询大约需要 4-5 秒:
- 这真的是预期的表现吗?
- 如果没有,您对如何改进查询有什么建议吗?我已经在 GroupID 上尝试了表索引。
- 我能否计算预期性能的上限,以了解我离最佳状态还有多远?
我对 SQL 服务器的唯一了解是它有 2GB 的内存。
这是执行计划(在 GroupID 上有一个简单的索引):
Gather (cost=5897.44..260656.04 rows=261275 width=44) (actual time=33.456..126.031 rows=227646 loops=1)
Workers Planned: 2
Workers Launched: 2
Buffers: shared hit=2755
-> Parallel Bitmap Heap Scan on data (cost=4897.44..233528.54 rows=108865 width=44) (actual time=11.099..34.584 rows=75882 loops=3)
Recheck Cond: (group_id = 915)
Heap Blocks: exact=492
Buffers: shared hit=2755
-> Bitmap Index Scan on idx (cost=0.00..4832.12 rows=261275 width=0) (actual time=32.792..32.793 rows=227646 loops=1)
Index Cond: (group_id = 915)
Buffers: shared hit=626
Planning Time: 0.064 ms
JIT:
Functions: 6
Options: Inlining false,Optimization false,Expressions true,Deforming true"
Timing: Generation 0.851 ms,Inlining 0.000 ms,Optimization 0.000 ms,Emission 0.000 ms,Total 0.851 ms
Execution Time: 145.180 ms
解决方法
是的,这是非常不错的性能,因为您选择了 227646 行。你很幸运,相关性很高(行都粘在相对较少的 8kB 块中)并且所有东西都被缓存了,否则性能会差很多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。