热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PostgreSQLDBA(119)pgAdmin(LIMIT:IndexScanvsBitmapIndexScan)

在PostgreSQL中,如使用limit,但执行计划中使用了BitmapIndexScan,则需要引起注意,可能PG计算成本时认为BitmapIndexScan比IndexSca

在PostgreSQL中,如使用limit,但执行计划中使用了Bitmap Index Scan,则需要引起注意,可能PG计算成本时认为Bitmap Index Scan比Index Scan或者Seq Scan要低,但实际上可能时间要比其他方式要长,原因是Bitmap Index Scan需要完成Index Rows的扫描在内存中建立Bitmap后才能访问表数据,而Index Scan或者Seq Scan则没有预先步骤直接扫描一行输出一行,因此Bitmap Index Scan在存在limit子句时性能可能会较差,尤其是在系统负载比较大的情况下。

Index Scan vs Bitmap Index Scan

Index Scan

Index scan reads the index in alternation, bouncing between table and index, row at a time.
Random I/O against the base table. Read a row from the index, then a row from the table, and so on.
useful in combination with LIMIT

Bitmap Index Scan

Scans all index rows before examining base table.This populates a TID bitmap.
Table I/O is sequential, results in physical order.
Handles LIMIT poorly

[local]:5432 pg12@testdb=# create table t_bitmapscan(id int,c1 varchar,c2 varchar,c3 varchar);
CREATE TABLE
Time: 20.424 ms
[local]:5432 pg12@testdb=#
[local]:5432 pg12@testdb=# insert into t_bitmapscan(id,c1,c2,c3)
pg12@testdb-# select x,'c1'||x,'c2'||x,'c3'||x from generate_series(1,700000) as x;
INSERT 0 700000
Time: 1695.539 ms (00:01.696)
[local]:5432 pg12@testdb=# insert into t_bitmapscan(id,c1,c2,c3)
pg12@testdb-# select x,'c1'||700001,'c2'||x,'c3'||x from generate_series(700001,1000000) as x;
INSERT 0 300000
Time: 712.709 ms
[local]:5432 pg12@testdb=#
[local]:5432 pg12@testdb=# create index idx_t_bitmapscan on t_bitmapscan(c1);
CREATE INDEX
Time: 1002.897 ms (00:01.003)
[local]:5432 pg12@testdb=#
[local]:5432 pg12@testdb=# explain (analyze,verbose) select * from t_bitmapscan where c1 = 'c1700001' and c2 like 'c2600%' limit 20;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Limit (cost=7755.68..13911.93 rows=20 c1700001'::text)
Filter: ((t_bitmapscan.c2)::text ~~ 'c2600%'::text)
Rows Removed by Filter: 100000
Heap Blocks: exact=939
Worker 0: actual time=118.092..118.093 rows=0 loops=1
Worker 1: actual time=118.503..118.503 rows=0 loops=1
-> Bitmap Index Scan on idx_t_bitmapscan (cost=0.00..6755.68 rows=300700 c1700001'::text)
Planning Time: 0.596 ms
Execution Time: 123.540 ms -->实际执行时间是123ms,计划成本较低
(18 rows)
Time: 124.760 ms
[local]:5432 pg12@testdb=# set enable_bitmapscan=off;
SET
Time: 1.378 ms
[local]:5432 pg12@testdb=# explain (analyze,verbose) select * from t_bitmapscan where c1 = 'c1700001' and c2 like 'c2600%' limit 20;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Limit (cost=1000.42..15348.68 rows=20 c1700001'::text)
Filter: ((t_bitmapscan.c2)::text ~~ 'c2600%'::text)
Rows Removed by Filter: 100000
Worker 0: actual time=76.905..76.905 rows=0 loops=1
Worker 1: actual time=77.297..77.297 rows=0 loops=1
Planning Time: 2.448 ms
Execution Time: 93.785 ms --> 实际执行时间为93ms,但计划成本较高
(15 rows)
Time: 97.455 ms
[local]:5432 pg12@testdb=#

参考资料
Bitmap Index Scan


推荐阅读
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 开发笔记:快速排序和堆排序
    本文由编程笔记#小编为大家整理,主要介绍了快速排序和堆排序相关的知识,希望对你有一定的参考价值。快速排序思想:在partition中,首先以最右边的值作为划分值x,分别维护小于 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • MySQL插入数据的四种方式及安全性分析
    本文介绍了MySQL插入数据的四种方式:插入完整的行、插入行的一部分、插入多行和插入查询结果,并对其安全性进行了分析。在插入行时,应注意字段的定义和赋值,以提高安全性。同时指出了使用insert语句的不安全性,应尽量避免使用。建议在表中定义相关字段,并根据定义的字段赋予相应的值,以增加插入操作的安全性。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 假设我有两个数组A和B,其中A和B都是mxn.我现在的目标是,对于A和B的每一行,找到我应该在B的相应行中插入A的第i行元素的位置.也就是说,我希望将np.digitize或np. ... [详细]
  • 数据结构与算法习题replacementselectionsort(置换选择排序)TimeLimit:1000msMemoryLimit:65536kBDescrip ... [详细]
  • 1.完全二叉树的概念除了最后一层之外的其它每一层都被完全填充,并且所有的节点都保证向左对齐。2.堆的结构首先,堆结构就是一棵完全二叉树࿱ ... [详细]
author-avatar
mobiledu2502885873
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有