gpt4 book ai didi

sql - 当 where 子句仅包含索引的第一列时,为什么不使用索引?

转载 作者:行者123 更新时间:2023-11-29 12:50:01 26 4
gpt4 key购买 nike

这是选择语句:

SELECT COUNT(*) FROM object_detection_label where company_id = 'SOME_COMPANY_ID'

行数:4700万

表格列:id、company_id、job_id、flight_plan_id、media_id、top、left、bottom、right、confidence class_id、classes_version、display_id。

主键:id

索引:company_id、job_id、flight_plan_id、media_id

结果来自:EXPLAIN ANALYZE SELECT * FROM object_detection_label where company_id = 'SOME_COMPANY_ID';

"Bitmap Heap Scan on object_detection_label  (cost=41048.21..1042966.23 rows=614131 width=153) (actual time=62.563..216.589 rows=592653 loops=1)"
" Recheck Cond: ((company_id)::text = 'SOME_COMPANY_ID'::text)"
" Heap Blocks: exact=14303"
" -> Bitmap Index Scan on company_id_job_id_fp_id_media_id_idx (cost=0.00..40894.67 rows=614131 width=0) (actual time=60.170..60.170 rows=592653 loops=1)"
" Index Cond: ((company_id)::text = 'SOME_COMPANY_ID'::text)"
"Planning time: 0.061 ms"
"Execution time: 316.966 ms"

结果来自:EXPLAIN ANALYZE SELECT * FROM object_detection_label where company_id = 'SOME_COMPANY_ID' and job_id = 'SOME_JOB_ID';

"Index Scan using company_id_job_id_fp_id_media_id_idx on object_detection_label  (cost=0.69..418.71 rows=102 width=153) (actual time=0.064..6.912 rows=13206 loops=1)"
" Index Cond: (((company_id)::text = 'CHURCH_OF_JESUS_CHRIST'::text) AND ((job_id)::text = '5cc085baa635404e54ebd46e'::text))"
"Planning time: 0.110 ms"
"Execution time: 10.114 ms"

请注意,它使用位图热扫描而不是索引扫描(如果我包含 job_id,它就会使用索引扫描)作为 where 子句的一部分。

在仅向 company_id 添加索引后,它仍然没有使用索引扫描。为什么会这样?如何让它使用索引扫描?

最佳答案

位图索引扫描一种索引扫描。

结果集是您的 47000000 行中的 600000 行,它们位于 14000 个 block 中。

这意味着对于正常的索引扫描,每个 block 都必须被访问多次,这是低效的。位图索引扫描按顺序获取所需的表 block ,每个 block 只获取一次。 PostgreSQL 估计这更有效,而且它可能是正确的。

您可以在设置后重新运行查询来验证这一点

SET enable_bitmapscan = off;

关于sql - 当 where 子句仅包含索引的第一列时,为什么不使用索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56485621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com