百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

从Oracle的SQL管理能力,看国产数据库差距

sinye56 2024-09-21 02:23 17 浏览 0 评论

SQL,作为与数据库交互的主要方式,其管理能力对数据库的安全稳定运行至关重要。作为数据库的标杆性产品,Oracle 在这方面能力非常全面;与之相对的是国产数据库还存在一定的差距。当前很多企业正面临国产化替代的过程,更需正视这一差距,通过在生态工具、实施方案及自研增强等多种手段加以完善补充。


下文从 Oracle 能力为基础,介绍相关能力作用及国产数据库当前现状。文中选择了部分国内主流数据库产品及开源产品作为对比,其相关能力取自官网和部分朋友的反馈。对比中加入了开源数据库,主要是因为部分国产数据库是基于开源数据库二次化开发而来,此处列入方便对比。


一、SQL 管理能力大对比


在下文展开之前,我们先通过一张表格做个全局性的概览。




1、SQL 解析


SQL 解析,简单描述就是将用户提交的 SQL 语句,交由数据库内核,经多个步骤后生成最终的执行计划,并交由执行器来完成执行。这其中关键能力有两个,一是执行计划缓存,一是解析过程的跟踪。


1)计划缓存


执行计划的缓存可以加速后续相同语句的执行速度,大部分数据库都内置了缓存能力,当然有利就有弊,有了缓存能力就需考虑缓存的更新机制等问题。Oracle Shard Pool 中的 Library Cache,保存了 SQL 对应的多个执行计划(以游标的形式存在)。可以说 Oracle 对执行计划的存储控制,是我见过最为完善的,考虑到很多情况(如绑定变量、数据特征等等)。国产数据库大多也支持了执行计划缓存,但管理粒度比较粗放且很多细节是未知的,相关文档资料较少。


2)过程跟踪


解析过程的跟踪,作为 SQL 优化的基础,理解执行计划的生成过程非常重要;数据库自身是否提供了一个窗口可以去观察内部执行机理,对于 DBA 优化非常实用。优化器生成执行的计划的过程是比较复杂的,当一条语句的执行计划较差,一个很好的入口就是查看下优化器生成执行计划的过程。Oracle 提供了等待事件 10053,可以对整个执行过程做了详细的了解,通过对这个事件的阅读可以帮我们回答很多问题。例如为什么选择这个索引?多个近似成本的执行计划的选择?等等。国产数据库在这方面功能差距较大,大多没有提供这一能力,很多时候是要靠 DBA 的经验来评估判断的。




2、执行计划


执行计划,可以语句在数据库中的执行路径,是了解数据库运行机理的重要窗口。在此部分需提供的能力包含几个,分别是执行计划的查看、固定、迁移和销毁。


1)查看执行计划


可以说优化 SQL 的第一步就是获得一份准确详实的执行计划。这里要区分两种情况,一种是根据用户提交的语句生成的执行计划,一种是对执行过或进行中的语句获得其执行计划。前者是优化器新生成的执行计划,但不代表是真实执行的,两者可能会存在差异。Oracle 提供了多种手段查看执行计划,而且可查询当前正在执行的或已结束语句的执行计划。国产数据库也都提供了查看执行计划的手段,但一般仅支持第一种方式且信息输出粒度也较Oracle存在一定差距。


2)固定执行计划


令DBA非常头疼的一个问题就是执行计划不稳定,受多种因素影响会出现这一现象,对于前端业务来说就会出现忽慢忽快的问题。为了使SQL语句的执行稳定下来,可以考虑对一些关键语句进行固定执行计划的工作。Oracle提供了多种手段达到这一目的。一种是常见的Hint方式,这种方式比较直接,但会导致失去其他优化的可能性的同时,需要手工修改语句;另外Oracle还提供了其他多种手段,从9i的Stored Outline、10g的SQL Profile到11g的SQL Plan Management,实现从被动到主动、从固定到灵活地实现了执行计划的稳定性。这方面国产数据库也都提供了一定的能力,但相对来说能力较少,还处于被动补救的状态,尚不支持主动防御性的能力。


3)迁移执行计划


当数据库需要迁移时,除了数据本身迁移外,还有很重要的一部分就是执行计划的迁移,这对于在新环境的稳定运行很关键。Oracle提供了多种方式完成迁移过程,国产数据库这方面比较缺失。


4)清理执行计划


如果一条语句的某个执行计划异常,常见的一个方式是让其失效后,由优化器重新生成一份执行计划。这时就需要能精准销毁到指定执行计划的能力。Oracle是提供了专有的命令来完成清理,当然也可以通过权限变更等手段间接来清理掉执行计划。国产数据库部分具备精确清理的能力,部分尚不具备。




3、SQL 优化


1)诊断优化


当出现某条语句性能比较差的情况,固然可以通过DBA人工来完成优化,但更优的方式是系统内置的诊断优化的能力。以Oracle为例,就提供了一组这样的能力,它通过对数据对象、统计信息、SQL语句本身等多维度评估,给出优化建议,用户更可以基于优化建议一键完成优化动作。这边可大大提高优化效率、降低优化成本,减轻DBA的工作压力。这方面国产数据库也具备一定能力,但一般都是通过外置工具来完成。


2)自动优化


上面谈到的优化动作是指人为主动干预,诊断优化指定语句,数据库还可以提供自动优化能力。Oracle一方面通过将若干上述能力组合实现了批量自动优化;一方面还提供一种自适应特性,即在语句执行过程中,动态根据执行情况实时干预后面的执行逻辑,修正执行计划达到最优。部分国产数据库也具备了类似的能力,但具体还待验证。




4、执行过程


1)查看过程


对SQL执行过程的全方位追踪,也非常重要,可以真实了解语句的执行状态,根据执行过程中暴露出的问题有针对性的进行调整优化。要做到对语句执行追踪是比较难的,需要兼顾效率、开销、粒度等。Oracle在这方面做的非常突出,其提出的事件模型较好地解决了这一问题。其提供了丰富的手段可以对正在执行或已经执行结束的语句实现过程查看。国产数据库在这方面差距还是很明显的,也看到有国内产品在仿照Oracle的方式来实现这一能力。


2)慢SQL


慢SQL,是DBA优化的入手点,这里谈到的慢SQL狭义上指执行时长超过预期的SQL,广义上是对更多资源粒度使用超出预期语句的集合。这方面Oracle基于AWR的存储库,提供了丰富的维度去检索查询语句。国产数据库这方面做到稍显单薄些,大多仅有对运行时间超长语句的输出。




5、其他能力


除了上述能力外,还有些能力也有助于对SQL的管理。例如可以重点标识语句的“着色”功能,用于升序迁移评估的SQL回放功能,用于调整对象进而影响执行计划的不可见索引,用于应急处理语句的雨具重写功能等。这部分功能比较零散,大多根据实践中不断增强,各厂商差异较大。



二、国产数据库实施建议


针对国产库现状的不足,在实施过程中可根据以下几个方面进行准备



1、制定开发规范


充分地了解国产数据库的技术特点,制定有针对性的设计开发规范。很多国产数据库基于多年实践,也都提供了开发规范,可以充分地予以吸纳。特别是针对分布式数据库,对开发有较多约束,要在系统设计、迁移之初就基于考虑。通常原则是尽量简化对数据库的使用,拒绝3B 大SQL(Big SQL) 大事务(Big transaction) 大批量(Big batch) 。



2、完善工具平台


基于国产数据库内核能力的不足,还需要较长一段时间来完善升级,可通过外部工具或平台的方式补齐内部短板。一方面可通过企业自研的方式增强对国产库的管理能力,一方面也可利用一些外围工具来增强。



3、培养人与技能


要想使用好国产数据库,更多是需要人员及技能。目前国产数据库在生态建设方面还尚属初期阶段,需要企业内部独立培养更多的人并具备相应的技能。只要充分地了解理解数据库,才能更好地使用它。业内有某公司使用国产数据库,内部超千人通过认证培训的案例即说明了这点。

相关推荐

程序员:JDK的安装与配置(完整版)_jdk的安装方法

对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...

Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置

一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...

麒麟系统安装JAVA JDK教程_麒麟系统配置jdk

检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...

学习笔记-Linux JDK - 安装&配置

前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

测试员必备:Linux下安装JDK 1.8你必须知道的那些事

1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...

Linux 下安装JDK17_linux 安装jdk1.8 yum

一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...

在Ubuntu系统中安装JDK 17并配置环境变量教程

在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...

如何在 Linux 上安装 Java_linux安装java的步骤

在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...

Windows和Linux环境下的JDK安装教程

JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...

linux安装jdk_linux安装jdk软连接

JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...

linux安装jdk,全局配置,不同用户不同jdk

jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...

运维大神教你在linux下安装jdk8_linux安装jdk1.7

1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...

window和linux安装JDK1.8_linux 安装jdk1.8.tar

Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...

最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?

默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...

取消回复欢迎 发表评论: