热门标签 | 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


点击此处阅读原文

↓↓↓



推荐阅读
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文深入探讨了MySQL中的高级特性,包括索引机制、锁的使用及管理、以及如何利用慢查询日志优化性能。适合有一定MySQL基础的读者进一步提升技能。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文通过一系列实验,探讨了Oracle 11g数据库中密码错误验证延迟特性对用户登录速度的影响。实验旨在验证当某个用户因输入错误密码而触发延迟时,是否会影响其他用户的正常登录速度。 ... [详细]
  • Docker基础入门与环境配置指南
    本文介绍了Docker——一款用Go语言编写的开源应用程序容器引擎。通过Docker,用户能够将应用及其依赖打包进容器内,实现高效、轻量级的虚拟化。容器之间采用沙箱机制,确保彼此隔离且资源消耗低。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 将XML数据迁移至Oracle Autonomous Data Warehouse (ADW)
    随着Oracle ADW的推出,数据迁移至ADW成为业界关注的焦点。特别是XML和JSON这类结构化数据的迁移需求日益增长。本文将通过一个实际案例,探讨如何高效地将XML数据迁移至ADW。 ... [详细]
  • Windows环境下Oracle数据库迁移实践
    本文详细记录了一次在Windows操作系统下将Oracle数据库的控制文件、数据文件及在线日志文件迁移至外部存储的过程,旨在为后续的集群环境部署做好准备。 ... [详细]
  • 本文详细介绍了MySQL InnoDB存储引擎中的Redo Log和Undo Log,探讨了它们的工作原理、存储方式及其在事务处理中的关键作用。 ... [详细]
  • MVC模式下的电子取证技术初探
    本文探讨了在MVC(模型-视图-控制器)架构下进行电子取证的技术方法,通过实际案例分析,提供了详细的取证步骤和技术要点。 ... [详细]
  • 1、编写一个Java程序在屏幕上输出“你好!”。programmenameHelloworld.javapublicclassHelloworld{publicst ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • 七大策略降低云上MySQL成本
    在全球经济放缓和通胀压力下,降低云环境中MySQL数据库的运行成本成为企业关注的重点。本文提供了一系列实用技巧,旨在帮助企业有效控制成本,同时保持高效运作。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
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社区 版权所有