SQL 语句优化是一个既熟悉又陌生的话题。面对千奇百怪的 SQL 语句,虽然数据库本身对 SQL 语句的优化一直在持续改进、提升,但是我们不能完全依赖数据库,应该在给到数据库之前就替它做好各种准备工作,这样才能让数据库来有精力做它自己擅长的事情。
日常的应用开发中可能需要优化SQL,提高数据访问和应用响应的效率,不同的SQL,优化的具体方案可能会有所不同,但是路径上,还是存在一些共性的。碰巧看到杨老师的这篇文章《第45期:一条 SQL 语句优化的基本思路》,为我们优化一些MySQL数据库的SQL语句提供了可借鉴的路径,值得参考和应用。
事物是普遍联系的,很多有业务意义的查询也会涉及多个数据表的关联。 BI 类软件通常会提供自助查询功能,有些软件还能支持关联查询,但实际使用的大多数还是单表的,关联查询功能很少被业务人员使用。涉及到关联表的查询常常需要由技术人员事先准备好,也就是我们常说的宽表。业务人员通常只会基于单一的宽表来做查询。关联查询是几乎所有 BI 类软件的软肋,无论大牌还是新秀,几乎一试一个准,全军覆没。 为什么会这样呢? 因为很多人不会用这些软件提供的多表关联查询功能。
每每一些很深刻的优化案例时,就会无比想念Oracle里的优化技巧,因为无论是从工具还是信息,都会丰富许多。
对于select语句,我们可以通过join/outer join来关联多个表;但是对于update语句,是不能直接通过join/outer join来关联多表数据的,这里仅针对PostgreSQL。
维表关联系列目录: 一、维表服务与Flink异步IO 二、Mysql维表关联:全量加载 三、Hbase维表关联:LRU策略 四、Redis维表关联:实时查询 五、kafka维表关联:广播方式 六、自定义异步查询
维表关联是离线计算或者实时计算里面常见的一种处理逻辑,常常用于字段补齐、规则过滤等,一般情况下维表数据放在MySql等数据库里面,对于离线计算直接通过ETL方式加载到Hive表中,然后通过sql方式关联查询即可,但是对于实时计算中Flink、SparkStreaming的表都是抽象的、虚拟的表,那么就没法使用加载方式完成。透过维表服务系列里面讲到的维表关联都是使用编码方式完成,使用Map或者AsyncIO方式完成,但是这种硬编码方式开发效率很低,特别是在实时数仓里面,我们希望能够使用跟离线一样sql方式完成维表关联操作。
又要提到前面那个说了好几遍的起别名问题了,使用resultMap标签也能解决这个问题。
接上一章的《图解SQL查询处理的各个阶段》,本文主要用图形的方式讲解JOIN ON在数据库中是怎么执行的。
BI商业智能这个概念已经提出好几十年了,这个概念本身比较宽泛,不同人也有不同的理解和定义,但落实到技术环节,特别是面向业务用户的环节,所称的BI,基本就是指的多维分析或者自助报表
书接上回,虽然Mybatis Plus帮我们提供了大量的默认方法,但我们为了实现多表关联查询,或者根据不同的查询条件传参,实现不同的动态SQL。在这种情况下我们还是需要自定义SQL,不管怎样我们需要首先通过配置指定Mapper.xml文件的存储位置。
DROP TRIGGER命令删除触发器。如果要修改现有触发器,则必须先调用DROP TRIGGER删除旧版本的触发器,然后再调用CREATE TRIGGER。
事物都是普遍联系的,很难有一个独立的事物不和其它发生关联,数据表也一样,很多有业务意义的查询都会涉及多个数据表的关联
这是一个统计类的 SQL,直接执行跑了好几个小时都没有结束,所以暂时不知道实际耗时,因为实在是太久了~
优化器是数据库最核心的功能,也是最复杂的一部分。它负责将用户提交的SQL语句根据各种判断标准,制定出最优的执行计划,并交由执行器来最终执行。优化器算法的好坏、能力的强弱,直接决定了语句的执行效率。笔者也使用了其他诸如MySQL、PostgreSQL、SQLServer等关系型数据库。综合比较来说,Oracle的优化器是功能最强大的。学习SQL优化,从本质来讲就是学习从优化器的角度如何看待SQL,如何制定出更优的执行计划。当然,优化器本身是数据库系统中最复杂的一个部分,本书会就优化器的分类、工作原理等做简单介绍,不会深入细节。
目前java 持久层ORM框架应用最广泛的就是JPA和Mybatis。JPA只是一个ORM框架的规范, 对该规范的实现比较完整就是Spring Data JPA(底层基于Hibernate实现),是基于Spring的数据持久层框架,也就是说它只能用在Spring环境内。Mybatis也是一个优秀的数据持久层框架,能比较好的支持ORM实体关系映射、动态SQL等。
IN 和 EXISTS 是 SQL 中常见的复杂条件,在将 SQL(存储过程)转换成库外计算获取高性能时也会面对这些问题。本文将以 TPC-H 定义的模型为基础,介绍如何用集算器的语法实现 IN、EXISTS 并做优化。
墨墨导读:某客户一系统早上业务高峰时段RAC数据库两节点CPU使用率接近100%,导致业务响应缓慢,通过分析原因定位SQL完成优化改写后降低CPU的使用率,业务恢复正常。
本篇的主题是关于数据模型的规范化和反规范化的讨论,其实也是一种常见的维度建模的设计和业务使用便捷性的冲突。
Elasticsearch 是一个强大的工具,尤其在全文检索、实时分析、机器学习、地理数据应用、日志和事件数据分析、安全信息和事件管理等场景有大量的应用。
其实早在去年我们就已经开始接触并研究clickhouse了,因为当时进行多表关联测试性能并不是特别优秀,所以并没有在线上大范围使用,当时研究的是分布式部署 (感觉分布式会比单机好一些)最后发现性能并不怎么样 而且分布式的sql也有很多限制,不支持单条删除和更新操作、不支持in和join(当时的版本,18.12.14之前),直到前几天看了携程一篇关于clickhouse的文章,将clickhouse的性能描述的神乎其神,再次勾起了我研究的欲望,附携程公众号文章 干货 | 每天十亿级数据更新,秒出查询结果,ClickHouse在携程酒店的应用
先说结论,我支持将逻辑写在 Java 等应用系统中。 观察了一下,传统企业以及绝大部分转型中的企业的 Java 应用中,很神奇的是,他们的开发人员包括我自己以前,大家都非常非常希望使用一个 SQL 来完成所有的逻辑的编写,非常多企业更是把数据库的存储过程和数据库自定义函数来完成。 老实说,这样子确实会提高开发的效率,因为不用写那么多查库聚合的操作,一切都在 SQL 中搞定了。另一方面来看,这确实会让 Java 代码看起来很鸡肋,好像只是把数据从 web 层到数据层的一个管道而已,一切 if else 能
一、开发需求 最近有一个开发需求,大致需要先使用主表,或主表和几张子表关联查询出ID(主键)及一些主表字段,然后再用这些ID查找最多10张表中对应的记录,主表记录数大约2000万,每张子表的记录数均为百万以上,最多可能会有5000万,主表一条数据可能对应子表多条数据。现在开发使用的逻辑是: 1.使用条件查询主表或主表和几张子表(不同场景)符合条件的主表记录ID值及其他一些主表字段项。 2.利用这些主表ID值,分别和几张子表使用IN子句,查询出子表中符合条件的记录项。有几张子表,就执行几次SQL语句。
0x00 前言 本篇的主题是关于数据模型的规范化和反规范化的讨论,其实也是一种常见的维度建模的设计和业务使用便捷性的冲突。 0x01 讨论 问题: 在设计数据表的时候,是一个宽表好,还是多个维度表好? 回答一: 数据仓库每张表的搭建,主要依赖于这个表在整个数据仓库中的作用和相关意义。首先要清楚这个表的存在是为了解决那些问题,什么角色使用,怎么保证使用者尽可能好的体验解决问题。从以上所提到的角度去看待问题,拆解以下几点因素: 拆表情况下多张数据表的查询SQL的编写难度有多大,是否会出现为了数据提取需要关联多张
ClickHouse 是近年来分析型数据库的热点,一向以快著称,很多其它以性能为卖点的分析型数据库也常常会用它作为一个对比标杆。很多用户碰到数据库运算性能问题时,也会考虑转向求助于 ClickHouse 解决 ClickHouse 确实是有过人之处,它的列式宽表速度很快,估计是压缩做得非常好。然而,除此之外,再无长处。希望用 ClickHouse 解决数据库计算性能问题的用户,大概率会失望的。
继承是面向对象开发时经常用到的,但是SQL Server 数据库不具备继承,那么怎么办能?我们可以利用如下三种方法:
答: • 支持 SQL 92 标准; • 支持 Mysql 集群,可以作为 Proxy 使用; • 支持 JDBC 连接多数据库; • 支持 NoSQL 数据库; • 支持 galera for mysql 集群,percona-cluster 或者 mariadb cluster,提供高可用性数据分片集群; • 自动故障切换,高可用性; • 支持读写分离,支持 Mysql 双主多从,以及一主多从的模式; • 支持全局表,数据自动分片到多个节点,用于高效表关联查询; • 支持独有的基于 E-R 关系的分片策略,实现了高效的表关联查询; • 支持一致性 Hash 分片,有效解决分片扩容难题; • 多平台支持,部署和实施简单; • 支持 Catelet 开发,类似数据库存储过程,用于跨分片复杂 SQL 的人工智能编码实现,143 行 Demo 完成跨分片的两个表的 JION 查询; • 支持 NIO 与 AIO 两种网络通信机制,Windows 下建议 AIO,Linux 下目前建议 NIO; • 支持 Mysql 存储过程调用; • 以插件方式支持 SQL 拦截和改写; • 支持自增长主键、支持 Oracle 的 Sequence 机制。
之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类、mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能。mybatis 插件自动生成的mapper 实现了大部分基本、通用的方法,如:insert、update、delete、select 等大概20个左右方法,都是比较基础的增删改查,这些通用Mapper提供的方法基本都能满足各种单表操作需求。
如何在多表关联场景下合理利用分区表来提升查询性能?基于前几篇关于分区表的介绍,想必大家对 MySQL 分区表的认知已经非常全面:分区表存在的目的就是为了减少每次检索的数据量从而提升整体性能。
Flink 1.11 引入了 Flink SQL CDC,CDC 能给我们数据和业务间能带来什么变化?本文由 Apache Flink PMC,阿里巴巴技术专家伍翀 (云邪)分享,内容将从传统的数据同步方案,基于 Flink CDC 同步的解决方案以及更多的应用场景和 CDC 未来开发规划等方面进行介绍和演示。
Oracle数据库中优化器(Optimizer)是SQL分析和执行的优化工具,是Oracle数据库中内置的一个核心模块。优化器的目的就是为了得到目标SQL的执行计划。Oracle数据库里的优化器又分为RBO(rule-Based Optimizer,基于规则的优化器)和CBO(Cost-Based Optimizer,基于成本的优化器)这两种类型。从Oracle 10g开始,Oracle数据库默认都是基于CBO的优化方式。
两表使用nest loop(以下简称NL)方式进行连接,小表驱动大表效率高,这似乎是大家的共识,但事实上这是有条件的,并不总是成立。这主要看大表扫描关联字段索引后返回多少数据量,是否需要回表,如果大表关联后返回大量数据,然后再回表,这个代价就会很高,大表处于被驱动表的位置可能就不是最佳选择了。
ClickHouse 是近年来分析型数据库的热点,一向以快著称,很多其它以性能为卖点的分析型数据库也常常会用它作为一个对比标杆。很多用户碰到数据库运算性能问题时,也会考虑转向求助于 ClickHouse 解决。
题目地址:https://leetcode-cn.com/problems/delete-duplicate-emails/
在Oracle 10g中,CBO 可选的运行模式有2种: (1) FIRST_ROWS(n) (2) ALL_ROWS – 10g中的默认值
SQL审核工具 SQLE 企业版近期推出了Oracle审核插件的第一个测试预览版。我们采集了过往我们在客户那碰到的问题和行业专家的建议,整理了一大批Oracle审核规则。这个版本我们从中挑选出现频次最高的以及影响范围最大一批规则加入到了Oracle审核插件中,这些规则能覆盖大多数客户的大多数场景,却又不会对客户使用产生额外的负担。在后续的时间内,我们将推出的Oracle审核插件逐步完善规则的拼图。接下来的内容将对高频规则给出我们的理解。插件的本身开发之前已经做过介绍,开发文档参考:https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_auditplugin/overview.html。
为什么SQL存在性能问题?我们通过10053,可以看到经过Oracle转换的SQL如下所示,
前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠 “部门编号” 进行关联。
1.分库分表的方式 垂直分表: 将一个表按照字段分成多表,每个表存储一部分字段,也即一表拆多表,按照特定字段。 垂直分库: 将原来关联紧密的数据库进行解耦,一库多表->多库多表,按照不同的表。 水平分表: 一库一表->一库多表 水平分库: 采用取模的方式将满足条件的方式存储到不同的库中,比如单双数据库将数据存储到不同库中,一库一表->多库一表 2.相关术语 逻辑表: 水平拆分的数据表的总称,如订单表:t_order_0、t_order_1...中的t_order 真实表: 在分片数据库中真实的表,如t_o
在Mybatis Plus 中,虽然IService 接口帮我们定义了很多常用的方法,但这些都是 T 对象有用,如果涉及到 多表的查询,还是需要自定义Vo 对象和自己编写sql 语句,Mybatis Plus提供了一个Page 对象,查询是需要设置其中的 size 字段 和 current 字段的值
但是小姐姐解释说,查询结果确实“诡异”的多出了184行,问题变的 interesting
用户交互的数据库处理 ORM思想: Object Relation Model 对象关系模型,映射到持久层【数据库】,存在 1 对 1 的映射关系 库 项目 表 类 字段,列 成员属性 记录 对象 多表关联 【外键 – 主键】1:1 持有对方对象【属性】 多表关联 【外键 – 主键】1:N 持有对方对象的框架集合【属性】 中间映射表 一般无需创建实体类,需要操作【订单】也可以创建实体类 Card表写成类: import java.sql.Timestamp; public class Card {
GaussDB的分布式架构充分运用了每个节点的计算资源,且随着节点规模的扩大其整体性能也呈线性增长。为了实现分布式架构下性能和资源的最大化利用,GaussDB提供了三种分布式执行计划,分别为FQS(Fast Query Shipping)计划、Stream计划以及Remote-Query计划,其中FQS和Stream是可以下推的计划。也就是说,集群中的所有DN都参与了SQL执行。
本项目由PingCAP投递并参与“数据猿年度金猿策划活动——2022大数据产业创新技术突破榜单及奖项”评选。
select查询优化一直是日常开发和数据库运维绕不开的一道坎,SQL的查询速度决定了页面的加载速度,进一步决定了客户浏览体验。
领取专属 10元无门槛券
手把手带您无忧上云