gpt4 book ai didi

Postgresql EXPLAIN 命令

转载 作者:行者123 更新时间:2023-12-04 15:20:06 29 4
gpt4 key购买 nike

我有一个查询,在 WHERE 子句之后有几个 filter 条件。

此外,大多数涉及的列都有索引。

当我运行 EXPLAIN 命令时,我看到:

->  Bitmap Index Scan on feature_expr_idx  (cost=0.00..8.10 rows=14 width=0)

feature_expr_idxWHERE 子句中其中一列的索引。

但不显示其他列的索引。相反,它们显示在 FILTER 行中:

  Filter: ((NOT is_deleted) AND (vehicle_type = 'car'::text) AND (source_type = 'NONE'::text))

为什么结果中只显示一个索引,而其他列也有索引而不是过滤器的一部分?

最佳答案

Postgresql 有一个聪明的引擎,它试图规划运行查询的最佳方式。通常,这涉及尽可能少地从磁盘读取数据,因为磁盘操作很慢。索引如此有用的原因之一是通过从索引中读取,我们可以找到表中需要读取的少量行以满足查询,从而避免读取整个表.但是请注意,索引也在磁盘上,因此读取索引也需要一些时间。

现在,假设您的查询有两个过滤器,一个在 A 列上,一个在 B 列上,两者都已建立索引。根据postgresql的统计,A列满足过滤条件的行大约有5行,B列满足过滤条件的行约有1000行。那么只读取A列的索引是有意义的,那么读取所有匹配的 5(左右)行,并过滤掉任何与 B 列上的过滤器不匹配的行。读取 B 列上的索引可能比只读取 5 行更昂贵!

实际原因可能与我的示例不同,但关键是 postgresql 只是试图尽可能高效。

关于Postgresql EXPLAIN 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63515408/

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