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

PostgreSQLhashbasesortMerge与索引(5)

点击阅读文章


文章转载自公众号:AustinDatabases

这是这个系列的第五期,本期到了SQL 执行计划中经常会出现的两个熟悉的面庞, hash-base  sort-Merge ,当然还有nested loops ,顺便这期还的说说索引,其中包含b-tree 索引以及bitmaps 数据结构,所以这期东西是异常混乱的。跟好了,别掉队哦 

首先还是从我们熟悉的 b-tree 说起,这个数据结构组成的方式是每种数据库都支持的快速查找数据的存储结构,并为之在他的基础上建立的算法,这样的组合我们称之为B+TREE 索引。所以一个索引是由数据结构和再次基础之上的算法组成的。

索引的成因其实主要还是因为数据量大,造成的数据查找定位的麻烦,所以索引的目的就是为了更快的获得数据准备的。那么会有一个问题,我先提出来,为什么是 B+TREE ,为什么B+TREE 是我们最常见的索引的类型,而不是别的,不是BRIN, 不是 GIST ,GIN 。

个人看法:一个最简单的数据结构,配合一个简单的算法,以及更快能估算出计算成本的方案,是一个应该被POP的方法,B+TREE 就是。为了估计b树搜索的代价,我们需要计算深度。如果每个块包含f个指针,那么每一层的块数量是前一层的f倍。因此,包含N条记录的树的深度为log N / log f。算法简单,数据存储只需要改变后的类二叉树的存储结构,所以并不是别的索引类型不好,而是别的成本相对B+TREE “贵”,而最常用的使用场景B+TREE 也有很好的适应性。

这里B+TREE 本身包含三个点组成,1 根节点  2 叶子节点  3 指针 ,通过根节点将数据的范围进行划分,通过少量的判断查询方式就能快速定位到具体ROW 存在的PAGE ,然后在对PAGE中的数据进行search,提取具体使用的数据,所以B+TREE 对于顺序,范围提取也是长项。


简单的说完B+TREE ,下面的说说商业数据库常见的一种数据结构,BITMAPS,你可以在ORACLE ,SQL SERVER ,PG 等数据库经常看到BITMAPS , 说完BTREE,实际上BITMAPS 本身也是一种索引,一种数据结构,也是一种符合这样数据存储结构下的算法。一个数据块是8KB, BITMAPS 就是表达在两个表进行数据对比的过程中,那些数据块都包含所需要的数据,以位图的方式表达出来.  对于求多个条件的等值计算,也是一个好的方法,通过逻辑 and 操作,可以快速的通过少量的位图块计算出需要的数据行的位置。 


位图方式的好处,主要体现在,查询中节省时间,减少在查询中的数据存储在大量的计算中对CPU的计算要求不高,并且可以有效的利用并行的方式进行计算。

位图方式的几个缺点也显而易见,1 对于频繁数据更新的表,BITMAPS维护的数据会被经常改变,修改BITMAPS的数据结构的数据难度比B+TREE 高, 同时对于采用BITMAPS的数据的采样率有一定要求,一定是查找的数据占整体数据行的少数,如果查找数据的行本身就占表数据量行的50%, 那么比对成本,要高于 TABLE SCAN 的成本。

下面就到标题中的下一个议题,nested loops ,  hash base,  sort-merge 这三个2个表结合时的处理方法。

1  Nested  Loops 

Nested loops 是两个表进行关联关系最简单的算法,通过条件匹配,将两个表分为驱动表和搜索表,最终通过对搜索表的逐行比对,找到两个表中互相匹配的数据。算法很简单,但随着驱动表的加大,效率是根据表的大小成倍的性降低。

rows(R) * rows(S)
FOR row1 IN table1 LOOP
         FOR row2 IN table2 LOOP
                 IF match(row1,row2) THEN
                      INSERT output row
                 END IF
        END LOOP
END LOOP


2  Hash-based

基于上面的Nested loop 的性能问题,针对与表之间的关系有了新的方式进行数据的过滤,hash base  ,hash join  , 这个方法是将其中一个表中的关联的值通过hash 算法的方式将计算好的值放置到buckets (桶)中,将另一个表的对应的值发送到这个桶中,进行类nested loop 的对比,并发现匹配值,最终定位匹配的记录。

这个算法显然比NESTED LOOP 效率要高,对比是以hash buckets 的方式,而不是ONE BY ONE 的方式, 其中的cost 以 两个表的行数以及连接属性来决定,这里POSTGRESQL 采用的是 BLOOM 过滤器来操作的比对,这比在桶中使用nested loop的方式要更快

cost(hash,R,S)=size(R)+size(S)+size(R)*size(S)/size(JA)



HASH BASE 的方式也会受制于表的大小以及这些HASH 的数据是否可以直接存储在内存中,如果这些HASH 的值无法存在内存中,则效率会大大的降低。

3  Sort - Merge

Sort Merge 的方法是通过对需要连接的两个表的属性数据进行排序,获得两个表的顺序的数据,然后根据两个表的顺序性的数据笛卡尔积,在比对的过程中,凡是具有相同值的两个行是不会在出现笛卡尔积的结果中的,则最终那些不在输出中的行就是我们要的结果。

成本主要在两个表进行排序的过程,如果对比的两个列存在索引,这个sort 的过程就不会再次建立。

Size(R)*log(size(R)) + size(s)*log(size(S))



以上的几种多表的连接算法,中每个都与行的数据量有关,无论哪种算法对于大表和大表的关联都不会一件轻松的事情,所以两个表的关联在设计中尽量保证不要两个都是大表。

前四期

Postgresql   SQL 优化   --full scan  index scan  index only 的区别

https://mp.weixin.qq.com/s__biz=Mzg4NDA0NTEwNA==&mid=2247494612&idx=1&sn=e5222627411adfc51a251abffcab423f&chksm=cfbc8f8bf8cb069da9fb78e48d3313aeee9a20545173c8153cdfc91f1e41ddf82be7128347cd&token=695620555&lang=zh_CN#rd

POSTGRESQL SQL优化 重优化轻设计对不对与优化需要掌握的知识类别

https://mp.weixin.qq.com/s__biz=Mzg4NDA0NTEwNA==&mid=2247494440&idx=1&sn=7eaf6a22b78f8229376fa8c4a3f48bc6&chksm=cfbc8f77f8cb0661a2db86558b347ee654a31284934cccd69cb3451968c3b4c47563d61802a7&token=160431904&lang=zh_CN#rd

postgresql SQL 优化 -- 理论与原理

https://mp.weixin.qq.com/s__biz=Mzg4NDA0NTEwNA==&mid=2247494506&idx=1&sn=61dfd3d8a7ccaba32321bb2f5a61d665&chksm=cfbc8f35f8cb0623728dcef8dbb6c1dd46ad884e7f370dfd04e66117de779dce15c80b76a541&token=2088516272&lang=zh_CN#rd

Postgresql  SQL 优化  两个模型与数据存储



预告 | 2021 PG亚洲大会12月与您相约
PG ACE计划的正式发布
三期PostgreSQL国际线上沙龙活动的举办
六期PostgreSQL国内线上沙龙活动的举办

中国PostgreSQL分会与腾讯云战略合作协议签订

中国PostgreSQL分会与美创科技战略合作协议签订
中国PostgreSQL分会与中软国际战略合作协议签订
中国PostgreSQL分会“走进”北京大学
中国PostgreSQL分会“走进”深圳大学
PGFans社区核心用户点亮计划

PostgreSQL 14.0 正式发布

深度报告:开源协议那些事儿

从“非主流”到“潮流”,开源早已值得拥有

Oracle中国正在进行新一轮裁员,传 N+6 补偿

PostgreSQL与MySQL版权比较

新闻|Babelfish使PostgreSQL直接兼容SQL Server应用程序

四年三冠,PostgreSQL再度荣获“年度数据库”

中国PostgreSQL分会入选工信部重点领域人才能力评价机构


更多新闻资讯行业动态技术热点,请关注中国PostgreSQL分会官方网站

https://www.postgresqlchina.com

中国PostgreSQL分会生态产品

https://www.pgfans.cn

中国PostgreSQL分会资源下载站

https://www.postgreshub.cn


点击此处阅读原文

↓↓↓



推荐阅读
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • HashMap的扩容知识详解
    本文详细介绍了HashMap的扩容知识,包括扩容的概述、扩容条件以及1.7版本中的扩容方法。通过学习本文,读者可以全面了解HashMap的扩容机制,提升对HashMap的理解和应用能力。 ... [详细]
  • MySQL外键1对多问题的解决方法及实例
    本文介绍了解决MySQL外键1对多问题的方法,通过准备数据、创建表和设置外键关联等步骤,实现了用户分组和插入数据的功能。详细介绍了数据准备的过程和外键关联的设置,以及插入数据的示例。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 本文介绍了解决Facebook脸书面试题中插入区间的方法,通过模拟遍历的方式判断当前元素与要插入元素的关系,找到插入点并将新区间插入。同时对算法的时间复杂度和空间复杂度进行了分析。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
author-avatar
weibophp
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有