postgresql - 按不使用索引的查询分组

标签 postgresql postgresql-10

这是我的查询 -

select bill, render, count (*)
from dx
group by bill, render

这是我为它创建的索引——

CREATE INDEX bill_render ON dx (bill, render);

为什么我的查询不使用带计数 (*) 和不带计数 (*) 的索引?

"Finalize GroupAggregate  (cost=70441673.89..89334654.09 
   rows=61437331 width=27)"
    "  Group Key: bill, render"
    "  ->  Gather Merge  (cost=70441673.89..87798720.82 rows=122874662 width=27)"
    "        Workers Planned: 2"
    "        ->  Partial GroupAggregate  
    (cost=70440673.86..73614935.97 rows=61437331 width=27)"
        "              Group Key: bill, render"
    "              ->  Sort  (cost=70440673.86..71080646.06 rows=255988880 width=19)"
    "                    Sort Key: bill, render"
    "                    ->  Parallel Seq Scan on dx (cost=0.00..18940581.80 rows=255988880 width=19)"

最佳答案

原因是它不能执行仅索引扫描,而普通索引扫描(必须获取表行以检查可见性)会比顺序扫描慢。

如果您想在 PostgreSQL 中进行仅索引扫描,您必须确保大多数表 block 在可见性映射中标记为“全部可见”。然后 PostgreSQL 可以跳过昂贵的堆获取。

可见性 map 由 VACUUM 维护,因此在表上运行它以提高性能。

关于postgresql - 按不使用索引的查询分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57698332/

相关文章:

ruby-on-rails - 如何将 Heroku PG 转储导入本地机器

postgresql - 多个键/值对的 PostgresQL 嵌套 jsonb 查询

postgresql-9.3 - PostgreSQL - 在 pg_dump 时刷新具体化 View

sql - AWS RDS Postgres 最大实例和表大小

sql - 如何在 DELETE 查询中将 postgres 函数结果用作单独的列

sql - 如何通过最大值知道其他列的值(PostgreSQL)?

postgresql - 我应该选择 ->> 还是 @>

php - 编码 php postgres json_encode

sql - 联合所有和总和

sql - 如果没有销售,则为零