我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PostgreSQL扫描方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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扫描方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PostgreSQL扫描方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

win7扫描文件的方法是什么

在Windows 7中,您可以使用以下方法来扫描文件:1. 使用设备和打印机:单击“开始”按钮,然后选择“设备和打印机”。在“设备和打印机”窗口中,找到您的扫描仪设备,右键单击它并选择“扫描”。2. 使用Windows扫描:在Windows
2023-09-20

什么是漏洞扫描系统?

漏洞扫描系统是一种网络安全工具,可识别系统中的安全漏洞,包括网络和应用程序中的漏洞。它使用端口扫描、协议分析、签名匹配和模糊测试等技术进行检测。漏洞扫描系统分为网络漏洞扫描器和应用程序漏洞扫描器,可以主动发现漏洞、自动化扫描过程、识别未知漏洞和改善合规性。需要注意的是,漏洞扫描系统也存在误报、无法检测所有漏洞、缺乏修复能力和需要专业知识等局限性。选择漏洞扫描系统时,应考虑扫描范围、检测能力、报告功能、自动化程度、易用性、支持和成本因素。
什么是漏洞扫描系统?
2024-04-02

空扫描Idle Scanning是什么意思

这篇文章给大家分享的是有关空扫描Idle Scanning是什么意思的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。空扫描Idle Scanning空扫描Idle Scanning是一种借助第三方实施的端口扫描技术
2023-06-04

win10开机扫描和修复驱动器的方法是什么

这篇文章主要介绍“win10开机扫描和修复驱动器的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win10开机扫描和修复驱动器的方法是什么”文章能帮助大家解决问题。修复方法:1、点击开始菜
2023-06-28

Spring中Bean扫描原理是什么

本篇内容主要讲解“Spring中Bean扫描原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring中Bean扫描原理是什么”吧!环境建设由于创建包扫描的条件很简单,只要在Xml中配
2023-07-02

Spring自动扫描无法扫描jar包中bean的解决方法

发现问题前几天用eclipse打包了一个jar包,jar包里面是定义的Spring的bean。然后将jar包放到lib下,设置spring的自动扫描这个jar包中的bean,可谁知根本无法扫描到bean,显示错误就是找不到bean,当时就纳
2023-05-31

springBoot mybatis 包扫描的方法

本篇内容主要讲解“springBoot mybatis 包扫描的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springBoot mybatis 包扫描的方法”吧!springBoot m
2023-06-20

android layout描边的方法是什么

在 Android 中,可以使用以下方法为布局添加描边:1. 使用 `android:background` 属性设置一个带有描边的自定义 drawable。首先创建一个 XML 文件,定义一个带有描边的 shape drawable,例如
2023-09-14

springMVC不扫描controller中的方法怎么解决

今天小编给大家分享一下springMVC不扫描controller中的方法怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下
2023-06-29

win8.1扫描仪在哪里?win8.1打印机自带扫描仪的使用方法

这几天办公室常常有同事来问,我们的打印机有没有扫描的功能,想要扫描点东西。经过一翻摸索,现在把它写出来和大家共享。那么要怎么来做呢?下面一起来看看: 1、在桌面上找到计算机,点击打开它。2、打开后找到,控制面板,点击打开。3、然后在里面找到
2022-06-04

spring配置不扫描service层的原因是什么

这篇文章将为大家详细讲解有关spring配置不扫描service层的原因是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。spring配置不扫描service层原因我将contoller给springm
2023-06-29

postgresql删除表的方法是什么

要在 PostgreSQL 中删除整个表,您可以使用 DROP TABLE 语句。以下是一个示例:DROP TABLE table_name;在上面的示例中:table_name 是您要删除的数据表名称。执行以上命令将永久删除指定的数据
postgresql删除表的方法是什么
2024-04-09

编程热搜

目录