AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 262143
Accepted
Kevin Meredith
Kevin Meredith
Asked: 2020-03-18 11:26:19 +0800 CST2020-03-18 11:26:19 +0800 CST 2020-03-18 11:26:19 +0800 CST

了解综合指数的解释计划

  • 772

在 PostgreSQL12.1上,给出:

postgres=> create table abc(a int not null, b text not null, c boolean not null);
CREATE TABLE

postgres=> create index on abc (a, b, c);
CREATE INDEX

然后我准备了一个只过滤 的查询a,即索引中的第一个元素。

postgres=> prepare only_a(int) as select 42 from abc where a = 1;
PREPARE

postgres=> explain execute only_a(100);
                                 QUERY PLAN                                 
----------------------------------------------------------------------------
 Bitmap Heap Scan on abc  (cost=4.20..13.67 rows=6 width=4)
   Recheck Cond: (a = 1)
   ->  Bitmap Index Scan on abc_a_b_c_idx  (cost=0.00..4.20 rows=6 width=0)
         Index Cond: (a = 1)
(4 rows)

根据上述内容,它可以使用索引来过滤a。

然后,我准备了一个过滤a和的查询c,即不使用b。

postgres=> prepare a_and_c(int) as select 42 from abc where a = 1 and c = true;
PREPARE

然后,我跑了explain execute,

postgres=> explain execute a_and_c(100);
                                 QUERY PLAN                                 
----------------------------------------------------------------------------
 Bitmap Heap Scan on abc  (cost=4.21..11.32 rows=3 width=4)
   Recheck Cond: (a = 1)
   Filter: c
   ->  Bitmap Index Scan on abc_a_b_c_idx  (cost=0.00..4.21 rows=3 width=0)
         Index Cond: ((a = 1) AND (c = true))
(5 rows)

我的理解是,这意味着Index Cond: ((a = 1) AND (c = true))尽管没有参与.abc_a_b_c_idxacbwhere

如果可以,c既然b不使用怎么能使用?

postgresql
  • 2 2 个回答
  • 129 Views

2 个回答

  • Voted
  1. Best Answer
    jjanes
    2020-03-18T12:01:44+08:002020-03-18T12:01:44+08:00

    “c”只是用作索引过滤器。它跳转到索引中“a”=1 的部分并对其进行扫描,直到“a”变为 >1。对于所有这些行,它会根据索引中找到的“c”值过滤掉“c”不正确的任何内容。

    不幸的是,EXPLAIN 语法没有区分用于跳转到索引的特定部分(或在相关值末尾停止索引扫描)的列与仅用于在索引中过滤的列。但是 EXPLAIN 不了解索引的内部结构,它只知道“c”正在被使用,它不知道它的使用效率如何。

    • 2
  2. Laurenz Albe
    2020-03-18T12:06:25+08:002020-03-18T12:06:25+08:00

    您想知道是对的,原因是 PostgreSQL 的解释输出中的马虎。

    在索引扫描期间,有些条件可以用来扫描索引,有些条件可以用作过滤器,这是对在索引扫描期间找到的行施加的附加条件。

    现在a = 1显然是可以用于扫描索引的条件。

    问题是在索引扫描期间有两种过滤方式:

    1. 在访问表之前,在扫描索引元组时丢弃它们。

    2. 根据在索引扫描期间从表中获取的值的条件丢弃结果行。

    第二种显示为filter,EXPLAIN但第一种过滤器显示为扫描条件的一部分。这就是你的条件c = true。

    EXPLAIN无法从输出中的第一类过滤器中分辨出扫描条件。

    请注意,第一种过滤器更有效,因为它减少了必须从堆中提取的行数,这是索引扫描的昂贵部分。

    • 2

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve