返回顶部
首页 > 资讯 > 数据库 >PostgreSQL扫描方法是什么
  • 335
分享到

PostgreSQL扫描方法是什么

2024-04-02 19:04:59 335人浏览 薄情痞子
摘要

这篇文章主要讲解了“postgresql扫描方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Postgresql扫描方法是什么”吧!关系型数据库都需

这篇文章主要讲解了“postgresql扫描方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Postgresql扫描方法是什么”吧!

关系型数据库都需要产生一个最佳的执行计划从而在查询时耗费的时间和资源最少。通常情况下,所有的数据库都会产生一个以树形式的执行计划:计划树的叶子节点被称为表扫描节点。查询节点对应于从基表获取数据。

例如,这一个查询:SELECT *FROM TAB1,TAB2 where TAB2.ID>1000。假设计划树如下:

PostgreSQL扫描方法是什么 

上面的计划树:“TBL1上的顺序扫描”和“TBL2上的索引扫描”分别对应于表TBL1和TBL2上的表扫描方法。TBL1上的顺序扫描:从对应页中顺序获取数据;索引扫描:使用索引扫描访问表2。选择一个正确的扫描方法作为计划的一部分对于查询性能非常重要。

深入理解PG的扫描方法之前,先介绍几个重要的概念。

 PostgreSQL扫描方法是什么

HEAP:存储表整个行的存储域。如上所示,整个域被分割为多个页,每个页大小默认是8K。每个页中,item指针(例如上述页中的1,2)指向页内的数据。

Index Storage:只存储KEY值,即索引中包含的列值。也是分割成多个页,每个索引页默认8K。

Tuple Identifier(TID):TID为6个字节,包含两部分。前4个字节为页号,后2个字节为页内tuple索引。TID可以定位到特定记录。

当前版本,PG支持以下扫描方法:顺序扫描、索引扫描、索引覆盖扫描、bitmap扫描、TID扫描。依赖于表基数、选择的表、磁盘io、随机IO、顺序IO等,每种扫描方法都非常有用。我们先创建一个表并预制数据,并解释这些扫描方法。

postgres=# CREATE TABLE demotable (num numeric, id int);
CREATE TABLE
postgres=# CREATE INDEX demoidx ON demotable(num);
CREATE INDEX
postgres=# INSERT INTO demotable SELECT random() * 1000,  generate_series(1, 1000000);
INSERT 0 1000000
postgres=# analyze;
ANALYZE

这个例子中,预制1亿条记录并执行analyze更新统计信息。

顺序扫描

顾名思义,表的顺序扫描就是顺序扫描对应表所有页的item指针。如果一个表有100页,每页有1000条记录,顺序扫描就会获取100*1000条记录并检查是否匹配隔离级别以及where条件。因此,即使只有1条记录满足条件,他也会扫描100K条记录。针对上表的数据,下面的查询会进行顺序扫描,因为有大部分的数据需要被selected。

postgres=# explain SELECT * FROM demotable WHERE num < 21000;
                             QUERY PLAN
--------------------------------------------------------------------
 Seq Scan on demotable  (cost=0.00..17989.00 rows=1000000 width=15)
   Filter: (num < '21000'::numeric)
(2 rows)

注意,不计算和比较计划耗费,几乎不可能直到选用哪个扫描方法。但是为了使用顺序扫描,至少需要满足以下关键点:谓词部分没有可用的索引键;或者SQL查询获取的行记录占表的大部分。如果只有少数行数据被获取,并且谓词在一个或多个列上,那么久会尝试使用或者不使用索引来评估性能。

索引扫描

和顺序扫描不同,索引扫描不会顺序获取所有表记录。相反,依赖于不同索引类型并和查询中涉及的索引相对应使用不同的数据结构。然后索引扫描获取的条目直接指向heap域中的数据,然后根据隔离级别判断可见性。因此索引扫描分两步:

从索引数据结构中获取数据,返回heap中数据对应的TID;然后定位到对应的heap页直接访问数据。由于以下原因需要执行额外的步骤:查询可能请求可用索引更多的列;索引数据中不维护可见信息,为了判断可见性,需要访问heap数据。

此时可能会迷惑,索引扫描如此高效,为什么有时不用呢?原因在于cost。这里的cost涉及IO的类型。索引扫描中,为了获取heap中的对应数据,涉及随机IO;而顺序扫描涉及顺序IO,只有随机IO耗时的1/4。

因此只有当顺序IO的代价大于随机IO时,才会选择索引扫描。

针对上表和数据,执行下面查询时会使用索引扫描。随机IO代价小,从而查询标记快。

postgres=# explain SELECT * FROM demotable WHERE num = 21000;
                                QUERY PLAN
--------------------------------------------------------------------------
 Index Scan using demoidx on demotable  (cost=0.42..8.44 rows=1 width=15)
   Index Cond: (num = '21000'::numeric)
(2 rows)

Index Only Scan

仅索引扫描和索引扫描类似,区别在于第二步,仅仅涉及到扫描索引数据。有两个条件:查询获取的数据只有key列,且该列是索引的一部分;所有获取的数据都是可见的。如下所示:

postgres=# explain SELECT num FROM demotable WHERE num = 21000;
                                  QUERY PLAN
-----------------------------------------------------------------------------
Index Only Scan using demoidx on demotable  (cost=0.42..8.44 rows=1 Width=11)
   Index Cond: (num = '21000'::numeric)
(2 rows)

Bitmap Scan

是索引扫描和顺序扫描的混合体。为了解决索引扫描的缺点并充分利用其优点。正如上面所说,对于索引数据结构中的数据,需要找到heap页中对应的数据。因此需要获取一次索引页,然后获取heap页,从而造成大量随机IO。Bitmap扫描方法平衡了不使用随机IO的索引扫描优点。

Bitmap index scan:首先获取索引数据并为所有TID创建bitmap。为了理解方法,可以认为bitmap包含所有页的哈希(基于页号),每个页的entry包含页内所有偏移的数组

Bitmap heap scan:从页的bitmap中读取值,然后针对页和偏移扫描数据。最后检查可见性和条件并返回tuple。

下面查询使用bitmap扫描,因为他选择的记录很多(比如too much for index scan)但不是大量(too little for sequential scan)。

postgres=# explain SELECT * FROM demotable WHERE num < 210;
                                  QUERY PLAN
--------------------------------------------------------------------------
 Bitmap Heap Scan on demotable  (cost=5883.50..14035.53 rows=213042 width=15)
   Recheck Cond: (num < '210'::numeric)
   ->  Bitmap Index Scan on demoidx  (cost=0.00..5830.24 rows=213042 width=0)
      Index Cond: (num < '210'::numeric)
(4 rows)

再看另一个查询,选择同样多的记录但是仅仅索引列。不需要heap页因次没有随机IO,因此这个查询选择index only scan而不是bitmap scan。

postgres=# explain SELECT num FROM demotable WHERE num < 210;
                                   QUERY PLAN
---------------------------------------------------------------------------
 Index Only Scan using demoidx on demotable  (cost=0.42..7784.87 rows=208254 width=11)
   Index Cond: (num < '210'::numeric)
(2 rows)

TID Scan

TID扫描是PG中非常特殊的一种方式,和oracle中的基于ROWID查询类似:

postgres=# select ctid from demotable where id=21000;
   ctid
----------
 (115,42)
(1 row)
postgres=# explain select * from demotable where ctid='(115,42)';
                        QUERY PLAN
----------------------------------------------------------
 Tid Scan on demotable  (cost=0.00..4.01 rows=1 width=15)
   TID Cond: (ctid = '(115,42)'::tid)
(2 rows)

此外,PG社区还在讨论其他的扫描方法:Mysql中的“Loose Index Scan”、Oracle中的“index skip scan”、DB2中的“jump scan”。这个扫描方法用在指定场景:选择的B-tree索引的key列值都不同。避免遍历所有相等的key值,而只遍历第一个唯一值然后跳到下一个大值。这项工作PG正在开发,同样被叫做“Index skip scan”,未来可以在release中看到这个特性。

感谢各位的阅读,以上就是“PostgreSQL扫描方法是什么”的内容了,经过本文的学习后,相信大家对PostgreSQL扫描方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL扫描方法是什么

本文链接: https://lsjlt.com/news/63618.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PostgreSQL扫描方法是什么
    这篇文章主要讲解了“PostgreSQL扫描方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL扫描方法是什么”吧!关系型数据库都需...
    99+
    2024-04-02
  • win7扫描文件的方法是什么
    在Windows 7中,您可以使用以下方法来扫描文件:1. 使用设备和打印机:单击“开始”按钮,然后选择“设备和打印机”。在“设备和...
    99+
    2023-09-20
    win7
  • PostgreSQL索引扫描时为什么indexonlyscan不返回ctid
    我们都知道在PostgreSQL中使用索引扫描时,是通过索引中存储的ctid去表中得到数据的。同时在PostgreSQL中如果要查询的列都在索引中,我们还可以使用index only...
    99+
    2024-04-02
  • 怎么理解PostgreSQL全表扫描问题
    这篇文章主要讲解了“怎么理解PostgreSQL全表扫描问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解PostgreSQL全表扫描问题”吧!本节...
    99+
    2024-04-02
  • Spring中Bean扫描原理是什么
    本篇内容主要讲解“Spring中Bean扫描原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring中Bean扫描原理是什么”吧!环境建设由于创建包扫描的条件很简单,只要在Xml中配...
    99+
    2023-07-02
  • 空扫描Idle Scanning是什么意思
    这篇文章给大家分享的是有关空扫描Idle Scanning是什么意思的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。空扫描Idle Scanning空扫描Idle Scanning是一种借助第三方实施的端口扫描技术...
    99+
    2023-06-04
  • win10开机扫描和修复驱动器的方法是什么
    这篇文章主要介绍“win10开机扫描和修复驱动器的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win10开机扫描和修复驱动器的方法是什么”文章能帮助大家解决问题。修复方法:点击开始菜单中...
    99+
    2023-06-28
  • Spring自动扫描无法扫描jar包中bean的解决方法
    发现问题前几天用eclipse打包了一个jar包,jar包里面是定义的Spring的bean。然后将jar包放到lib下,设置spring的自动扫描这个jar包中的bean,可谁知根本无法扫描到bean,显示错误就是找不到bean,当时就纳...
    99+
    2023-05-31
    spring jar包 bean
  • springBoot mybatis 包扫描的方法
    本篇内容主要讲解“springBoot mybatis 包扫描的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springBoot mybatis 包扫描的方法”吧!springBoot m...
    99+
    2023-06-20
  • PostgreSQL索引扫描时为什么index only scan不返回ctid
    我们都知道在PostgreSQL中使用索引扫描时,是通过索引中存储的ctid去表中得到数据的。同时在PostgreSQL中如果要查询的列都在索引中,我们还可以使用index only scan。 既然如此,当我们在查询中...
    99+
    2024-04-02
  • mysql避免全屏扫描的方法
    这篇文章将为大家详细讲解有关mysql避免全屏扫描的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。MYSQL避免全表扫描的方法:1、where及order ...
    99+
    2024-04-02
  • android layout描边的方法是什么
    在 Android 中,可以使用以下方法为布局添加描边:1. 使用 `android:background` 属性设置一个带有描边的...
    99+
    2023-09-14
    android
  • win8.1扫描仪在哪里?win8.1打印机自带扫描仪的使用方法
    这几天办公室常常有同事来问,我们的打印机有没有扫描的功能,想要扫描点东西。经过一翻摸索,现在把它写出来和大家共享。那么要怎么来做呢?下面一起来看看: 1、在桌面上找到计算机,点击打开它。 2、打开后找到,...
    99+
    2022-06-04
    扫描仪 自带 使用方法
  • springMVC不扫描controller中的方法怎么解决
    今天小编给大家分享一下springMVC不扫描controller中的方法怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-06-29
  • springMVC不扫描controller中的方法问题
    目录springMVC不扫描controller下面是正确的spring-mvc.xml文件那我遇到这个问题的原因是什么呢?springMVC包扫描问题为什么@COntroller要...
    99+
    2024-04-02
  • C#端口扫描器的编写方法
    目录一、项目设计二、单线程三、多线程小结本文实例为大家分享了C#端口扫描器的编写代码,供大家参考,具体内容如下 一、项目设计 新建项目 整体设计 最终设计 二、单线程 1.代码...
    99+
    2024-04-02
  • Oracle索引范围扫描操作流程是什么
    本篇内容主要讲解“Oracle索引范围扫描操作流程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle索引范围扫描操作流程是什么”吧!索引范围扫描就...
    99+
    2024-04-02
  • spring配置不扫描service层的原因是什么
    这篇文章将为大家详细讲解有关spring配置不扫描service层的原因是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。spring配置不扫描service层原因我将contoller给springm...
    99+
    2023-06-29
  • NMAP为什么扫描不到端口
    NMAP为什么扫描不到端口...
    99+
    2023-06-04
  • postgresql删除表的方法是什么
    要在 PostgreSQL 中删除整个表,您可以使用 DROP TABLE 语句。以下是一个示例: DROP TABLE table...
    99+
    2024-04-09
    postgresql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作