news 2026/5/9 18:22:23

HGDB中的扫描类型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HGDB中的扫描类型

文章目录

  • 文档用途
  • 详细信息

文档用途

介绍HGDB中的扫描类型

详细信息

1、全表扫描
全表扫描在HGDB中也称为顺序扫描(seq scan),全表扫描就是把表的所有数据块从头到尾读一遍,然后筛选出符合条件的数据块。

全表扫描在explain命令输出结果中用“Seq Scan”表示,如下所示:

highgo=# explain select * from emp;QUERYPLAN------------------------------------------------------Seq Scanonemp(cost=0.00..1.14rows=14width=116)(1行记录)

2、索引扫描

索引通常是为了加快查询数据的速度而增加的。索引扫描,就是在索引中找出需要的数据行的物理位置,然后再到表的数据块中把相应的数据读出来。

索引扫描在explain命令输出结果中用"Index Scan"表示,如下:

highgo=# explain select * from people where id=14;QUERYPLAN---------------------------------------------------------------------IndexScanusinginx_idonpeople(cost=0.44..8.45rows=1width=8)IndexCond:(id=14)(2行记录)

3、位图扫描

位图扫描也是走索引的一种方式。方式是扫描索引,把满足条件的行或块在内存中建一个位图,扫描完索引后,再根据位图列表的数据文件把相应的数据读出来。如果走了两个索引,可以把两个索引形成的位图进行"and"或"or"计算,合并成一个位图,再到表的数据文件中把数据读出来。

当执行计划的结果中行数很多时会进行位图扫描,如非等值查询、IN子句或有多个条件都可以走不通的索引时。

以下示例是返回值较多:

highgo=# explain select ename from test where empno=7499;QUERYPLAN----------------------------------------------------------------------------Bitmap Heap Scanontest(cost=79.79..613.59rows=4064width=5)Recheck Cond:(empno=7499)->BitmapIndexScanoninx_empno(cost=0.00..78.77rows=4064width=0)IndexCond:(empno=7499)(4行记录)`

在位图扫描中,可以看到"Bitmap Index Scan"先在索引中找到符合条件的行,然后在内存中建立位图,之后再到表中扫描,也就是看到" Bitmap Heap Scan"。

4、条件过滤

条件过滤,一般就是在where条件上加的过滤条件,当扫描数据行时,会找出满足过滤条件的行。条件过滤在执行计划中显示为"Filter",示例如下:

highgo=# explain select ename from emp where empno=7499;QUERYPLAN----------------------------------------------------Seq Scanonemp(cost=0.00..1.18rows=1width=38)Filter:(empno=7499)(2行记录)

5、Nestloop Join

嵌套循环(Nestloop Join)是在两个表连接时一种连接方式。在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大,要把返回子集较小的表作为外表,且内表的连接字段上要有索引。

执行过程:确定一个驱动表(outer table),另一个表为inner table,驱动表中每一行与inner table中的相应记录关联。

示例如下:

highgo=# explain select * from people,dept where dept.deptno=people.id;QUERYPLAN---------------------------------------------------------------------------NestedLoop(cost=0.44..5719.30rows=680width=100)->Seq Scanondept(cost=0.00..16.80rows=680width=92)->IndexScanusinginx_idonpeople(cost=0.44..8.38rows=1width=8)IndexCond:(id=dept.deptno)(4行记录)

6、Hash Join

优化器使用两个比较的表,并利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。

这种方式适用于较小的表可以完全放于内存中的情况,这样总成本就是访问两个表的成本之和。但如果表很大,不能完全放入内存,优化器会将它分割成若干不听的分区,把不能放入内存的部分写入磁盘的临时段,此时要有较大的临时段以便提高I/O的性能。

示例如下:

highgo=# explain select * from test,dept where dept.deptno=test.deptno;QUERYPLAN--------------------------------------------------------------------HashJoin(cost=25.30..1870.22rows=57344width=127)HashCond:(test.deptno=dept.deptno)->Seq Scanontest(cost=0.00..1056.44rows=57344width=35)->Hash(cost=16.80..16.80rows=680width=92)->Seq Scanondept(cost=0.00..16.80rows=680width=92)(5行记录)

因为dept表小于test表,所以Hash Join先在较小的表dept上建立散列表,然后扫描较大的表test,并探测散列表,找出与之相匹配的行。

7、Merge Join

通常情况下,散列连接的效果比合并连接好,但如果源数据上有索引,或者结果已经被排过序,在执行排序合并连接时,就不需要排序了,这时合并连接的性能会优于散列连接。

下面示例中,people的id字段和dept01的depto字段都有索引,且从索引扫描的数据已经排好序,可以直接走Merge Join:

highgo=# explain select people.id from people,dept01 where people.id=dept01.deptno;QUERYPLAN-------------------------------------------------------------------------------------------------MergeJoin(cost=0.86..64873.59rows=1048576width=4)MergeCond:(people.id=dept01.deptno)->IndexOnly Scanusingpeople_pkeyonpeople(cost=0.44..303935.44rows=10000000width=4)->IndexOnly Scanusingidx_deptnoondept01(cost=0.42..51764.54rows=1048576width=2)(4行记录)

删除dept01上的索引,会发现执行计划中先对dept01排序后在走Merge Join,示例如下:

highgo=# explain select people.id from people,dept01 where people.id=dept01.deptno;QUERYPLAN-------------------------------------------------------------------------------------------------MergeJoin(cost=136112.80..154464.29rows=1048576width=4)MergeCond:(people.id=dept01.deptno)->IndexOnly Scanusingpeople_pkeyonpeople(cost=0.44..303935.44rows=10000000width=4)->Materialize(cost=136112.36..141355.24rows=1048576width=2)->Sort(cost=136112.36..138733.80rows=1048576width=2)SortKey: dept01.deptno->Seq Scanondept01(cost=0.00..16918.76rows=1048576width=2)(7行记录)

上面执行计划中,可看到“Sort Key: dept01.deptno”,这就是对表dept01的id字段进行排序。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 7:33:47

深度剖析eBPF技术原理及其在微服务网关性能优化中的实践应用

【精选优质专栏推荐】 《AI 技术前沿》 —— 紧跟 AI 最新趋势与应用《网络安全新手快速入门(附漏洞挖掘案例)》 —— 零基础安全入门必看《BurpSuite 入门教程(附实战图文)》 —— 渗透测试必备工具详解《网安渗透工具使用教程(全)》 —— 一站式工具手册《CTF 新手入门实战教…

作者头像 李华
网站建设 2026/5/1 23:48:36

三菱FX5U实现4层电梯升降控制:PLC与触摸屏程序全解析

三菱FX5U控制的4层电梯升降,系统为FX5UFX5-40SSC-S简单运控模块。 包含一个PLC程序和触摸屏程序。 程序有详细的注释。一、引言 在自动化控制领域,电梯控制是一个经典且应用广泛的场景。本文将介绍如何使用三菱FX5U系列PLC搭配FX5 - 40SSC - S简单运控模…

作者头像 李华
网站建设 2026/5/3 16:11:26

Tomcat架构与核心组件面试题

基础级别 1. 什么是Apache Tomcat?它的主要作用是什么? 答案: Apache Tomcat是一个开源的Java Servlet容器和Web服务器,由Apache软件基金会开发和维护。它实现了Java Servlet、JavaServer Pages (JSP)、Java Expression Language和Java WebSocket等Java EE规范。 主要作用: 作…

作者头像 李华
网站建设 2026/4/19 22:57:28

SpringMVC深度解析从基础架构到实战应用的全方位指南

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 持续学习,不断…

作者头像 李华
网站建设 2026/4/18 10:51:39

双组分精准快检,汽修年检利器:MEXA-324M汽车尾气测量仪项目实战全解

双组分精准快检,汽修年检利器:MEXA-324M汽车尾气测量仪项目实战全解在汽车维修保养与年检行业对尾气检测效率和精准度要求日益提升的背景下,快速、可靠、易用的CO/HC双组分尾气测量已成为汽修厂故障诊断、排放合规性检测与日常维护的核心工具…

作者头像 李华