gpt4 book ai didi

PostgreSQL 范围查询索引

转载 作者:行者123 更新时间:2023-11-29 12:23:52 27 4
gpt4 key购买 nike

假设我在 PostgreSQL 中有一个简单的表:

CREATE TABLE bingest.some_data (
report_date DATE NOT NULL,
client_id UUID NOT NULL,
value_1 INT, value_2 INT, value_3 INT,
value_4 INT, value_5 INT, value_6 INT,
value_7 INT, value_8 INT, value_9 INT,
value_10 INT, value_11 INT, value_12 INT,
value_13 INT, value_14 INT, value_15 INT,
value_16 INT, value_17 INT, value_18 INT,
value_19 INT,
PRIMARY KEY (report_date, client_id));

我想在下面的查询中使用索引

SELECT * FROM some_data WHERE report_date > '2018-10-30';

对于上面的查询,EXPLAIN 命令给了我这个

Seq Scan on some_data  (cost=0.00..18.12 rows=217 width=96)
Filter: (report_date > '2018-10-30'::date)
Planning time: 0.061 ms
Execution time: 0.019 ms

索引是在我指定上下界的时候使用的

SELECT * FROM some_data WHERE report_date > '2018-10-30' AND < '2019-10-30'

对于这个 EXPLAIN 给出以下输出:

Bitmap Heap Scan on some_data  (cost=4.18..11.30 rows=3 width=96)
Recheck Cond: ((report_date > '2018-10-30'::date) AND (report_date < '2019-10-30'::date))
-> Bitmap Index Scan on some_data_pkey (cost=0.00..4.18 rows=3 width=0)
Index Cond: ((report_date > '2018-10-30'::date) AND (report_date < '2019-10-30'::date))
Planning time: 0.072 ms
Execution time: 0.027 ms

我还没有任何数据,但我想为这个表准备正确的索引。

最佳答案

如果一个表完全是空的,PostgreSQL 估计它包含 10 页(参见 estimate_rel_size 中的 src/backend/optimizer/util/plancat.c)。

如果一个表包含几行并且还没有自动清理,我们就不会得到灾难性的低估。

结果是空表的估计完全是假的,你的观察没有任何意义。

要测试索引是否可以使用,设置enable_seqscan关闭并解释查询。如果它仍然选择昂贵的顺序扫描,那么它会这样做,因为它无法使用索引。

关于PostgreSQL 范围查询索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53066221/

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