化腐朽为神奇的QueryMapping
化腐朽为神奇的QueryMapping
老车除了报废没别的方法?
应用系统就像老车,经过十几二十年的使用,积累了大量里程数据,但是英雄迟暮,反应迟钝,时不时还要病休。但就这样报废,推到重来,如果没有充足的预算,实在是下不了这个决心,不知道该怎么办,让这辆老车焕发第二春。
人们习惯,难以改变
缓慢的启动
已经在驾驶室坐好,发动机已经启动,人也准备妥当,就是老车慢热。已经过去了十分钟,老车还是不能出发。
工作时间到了,人们纷纷打开应用系统,然后就把他切换到后台,开始其他的工作。因为应用软件系统已经工作了十年,累计了海量的数据,而且软件用户增加数倍,很多功能界面打开时间越来越长。
但是人们习惯这样工作模式,不愿改进。
仪表盘的指针总是滞后
今天收到了超速罚单,实在是冤枉。驾驶认真 ,时刻注意指针,避免超速,可是速度指示滞后,让超速摄像头抓拍了。
数据库管理员抱怨,反馈告警信息,不够及时,造成不知道数据库处于崩溃的边缘。
又在高速抛锚
需要高速行驶的时间,越来越长,老车就罢工。
虽然升级的服务器资源,但是低效的查询语句,把新资源消耗在冗余的运算中。
增加一个行李架,不得不降速
任务越来越多,需要加装行李架,但是车速就要下降了。
新的业务不断加入到应用系统,但原有模式的性能,已经不能满足新的需求。
车虽老,使用更频繁
用户多了,根本没有休息的时间,只能一边工作,一边改善维修。
在一个7*24 的应用系统中,没有给数据库管理员,留出足够运维窗口时间,晚上的定时任务,执行时间越来越长,甚至到了第二条的上班时间。
深挖潜能,不断涌现新问题
全表过滤不能满足性能要求
有些查询没有预计数据表增大了,原来可以全表进行条件过滤的查询,已经严重影响工作。
数据多源,使用视图代替原表名
业务类型增加,数据来源复杂,数据表不得不使用视图整合多源的数据表,这就增加查询的硬解析时间。
数据海量增长,使用分区表
分区表的分区过多,带来硬解析的时间超长,这是频繁执行的查询所不能忍受。
外部数据增加,网络交互量延长查询时间
原本性能很好的查询,突然变慢了,发现远程的外部表,突然数据增加很多,而且以后持续增长。
数据库遇到性能瓶颈
运行多年负荷逐渐增加
- 数据量的积累
- 用户数增多
- 功能点使用增多
数据库优化手段
优化SQL语句,但是:
复杂多变的过滤条件,无法创建适合的索引
商业软件的SQL语句, 已经封装,不能修改
应用系统已经验收,项目结束,开发团队已经离场
上述理由,造成在数据库中执行的SQL语句,无法改变。
硬件优化与升级
升级CPU,增加并行度;
升级内存,增加数据缓存
升级存储与网络,使用磁盘IO的高带宽低时延的解决方案
由于不能投入更多的资金,升级服务器的硬件资源,所以无法提升数据库的性能参数。
传统数据库厂商Oracle的解决方案
Outline
锁定一个给定SQL语句的执行计划,保持其执行计划稳定,不管数据库环境如何变更。
Outline将执行计划的hint集合保存在outline的表中(数据字典)。当执行SQL解析时,Oracle会与outline中的SQL比较,如果该SQL有保存的outline,则通过保存的hint集合生成指定执行计划。
SQL Tuning Advisor
SQL Tuning Advisor 检查给定的 SQL 语句或一组 SQL 语句,并提供提高效率的建议。它可以提出各种类型的建议,例如创建 SQL Profile(使查询优化器能够为 SQL 语句创建最佳执行计划的信息集合)、重组 SQL 语句和刷新优化器统计信息。SQL Tuning Advisor 还使您能够从过去选取备用执行计划(存储在 AWR 中)并将其与 SQL 语句一起使用,还可以推荐并行度配置文件。SQL 优化顾问是一种机制,用于解决与次优执行 SQL 语句相关的问题,获取有关提高 SQL 语句性能的建议,并通过仅执行最佳计划来防止回归。
SQL Plan Baseline Management
SQL Plan Baseline Management是一种预防性机制,它使优化程序能够自动管理执行计划,从而确保数据库仅使用已知或已验证的计划。 首要用途是可防止由计划更改引起的性能回归,其次是通过仅验证和接受可提高性能的计划更改,优雅地适应更改,例如新的优化程序统计信息或索引。
SQL 计划管理的主要组件,有计划捕获、计划选择、计划演变。
上述方案,都是通过稳定SQL语句的执行计划,解决因数据膨胀或需求增加,带来的SQL语句性能问题。
这些创意改造让人超惊喜!
改造工具:QueryMapping
KingbaseES Query Mapping 是一种查询映射功能。有过SQL优化经历的人都知道,对于有些SQL性能问题,可能需要涉及到SQL层面的修改,这不仅麻烦,而且在已上线的系统还存在很大的风险。KingbaseES V8R6 提供了query mapping功能,用户可以通过SQL映射,可以避免直接修改SQL的过程。 可以用高效的查询语句,悄然的替换不堪大用的旧查询语句。
使用优化后的SQL代替原SQL,使用索引代替全表,
读取某日的数据的查询,原SQL使用trunc()函数,截断date类型数据的time部分,造成无法使用索引。由于全表数据量较少,尚未影响查询的性能,但是随着时间,速度慢的问题逐渐暴露出来。
drop table tt66;
create table tt66
as
select id ,now()-random()*100 c1
from generate_series(1,100000) id;
create index tt66_c1 on tt66(c1);
explain analyze
select * from tt66 where trunc(c1) = to_date('2022-09-01','yyyy-mm-dd');
Seq Scan on tt66 (cost=0.00..2044.00 rows=500 width=12) (actual time=0.014..17.080 rows=1023 loops=1)
Filter: ((trunc(c1, 'DDD'::text))::timestamp without time zone = '2022-09-01 00:00:00'::timestamp without time zone)
Rows Removed by Filter: 98977
Planning Time: 0.226 ms
Execution Time: 17.112 ms
--如下的SQL,才能使用索引
explain analyze
select * from tt66 where c1 >= '2022-09-01'::date and c1 < '2022-09-01'::date + 1 ;
--创建SQL映射关系
select drop_query_rule('qm08');
select create_query_rule('qm08','select * from tt66 where trunc(c1)= to_date($1,''yyyy-mm-dd'');','select * from tt66 where c1 >= to_date($1,''yyyy-mm-dd'') and c1 <to_date($1,''yyyy-mm-dd'') +1;', true, 'text');
--验证查询脚本没有修改,但是执行性能得到提升。
explain (usingquerymapping,analyze)
select * from tt66 where trunc(c1) = to_date('2022-09-01','yyyy-mm-dd');
Bitmap Heap Scan on tt66 (cost=22.35..593.43 rows=981 width=12) (actual time=0.157..0.608 rows=1023 loops=1)
Recheck Cond: ((c1 >= '2022-09-01 00:00:00'::timestamp without time zone) AND (c1 < '2022-09-02 00:00:00'::timestamp without time zone))
Heap Blocks: exact=457
-> Bitmap Index Scan on tt66_c1 (cost=0.00..22.10 rows=981 width=0) (actual time=0.129..0.129 rows=1023 loops=1)
Index Cond: ((c1 >= '2022-09-01 00:00:00'::timestamp without time zone) AND (c1 < '2022-09-02 00:00:00'::timestamp without time zone))
Planning Time: 0.403 ms
Execution Time: 0.642 ms
比较 Oracle 固化执行计划方案 的差异
SQL语句的执行计划不稳定,往往因为统计信息发生变化。当数据量的变化,或者增加索引,需要改变SQL语句,才能改善应用系统的性能。固化执行计划方案虽然可以解决数据库环境发生变化时的性能问题 ,一旦改变了数据结构,则无能为力了。
Query Mapping 可以使用完全不同的SQL语句,替代原SQL语句,生成崭新的查询结果。这样既可以优化查询语句,也能从不同的表和列获得结果。KES的SQL语句,只能在同一个事务中,生成一次执行计划,不需要重复解析语句,但是即使在同一个会话不同的事务中,重复执行同一个SQL语句,也需要解析语句。如果SQL语句非常复杂,解析时间就会很长,甚至超过执行时间。Query Mapping 可以使用函数封装复杂SQL语句,用来替代原SQL语句,从而减少解析时间,提高应用系统的性能。
垂死病中惊坐起
由于时代的局限,历史数据的累计,造成性能良好的老应用系统,逐渐的不堪使用。QueryMapping 功能,可以让这些疲惫的老爷车,枯木逢春,再战二十年。
化腐朽为神奇的QueryMapping的更多相关文章
- Java牛人
Java领域有很多著名的人物,他们为Java社区编写框架.产品.工具或撰写书籍改变了Java编程的方式.本文是<最受欢迎的8位Java牛人>的2.0版本. PS:排名不分先后.本文的信息整 ...
- 从一道NOI练习题说递推和递归
一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...
- Unity3D将来时:WebGL
作者:小玉链接:https://zhuanlan.zhihu.com/p/19974794来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 随着Unity5.0的发布,W ...
- JavaScript –类型之我晕
每次写博我觉得取上恬当的题目比整篇行文都难,词量有限的情况下突然想到JavaScript拾遗应该会是一个非常文艺而夺目的博文题目,但我并没有急着使用,经验告诉我应该先去搜一下看有没有被用过.果不其然, ...
- 【译】用jQuery 处理XML--写在前面的话
用jQuery 处理XML--写在前面的话 用jQuery 处理XML-- DOM(文本对象模型)简介 用jQuery 处理XML--浏览器中的XML与JavaScript 用jQuery 处理XML ...
- 【转】PowerShell入门(七):管道——在命令行上编程
转至:http://www.cnblogs.com/ceachy/archive/2013/02/22/PowerShell_Pipeline.html 管道对于Shell来说是个化腐朽为神奇的东西, ...
- stack overflow--技术问答网站
转自:http://baike.baidu.com/link?url=eMR6Pwdk9IkauI5B3nZb2Yo3VUAcK6vQfrMpcSMPWqgH0ngqFkup3Gdr3t_s_yZe_ ...
- 《Xenogears》(异度装甲)隐含的原型与密码
<Xenogears>(异度装甲)隐含的原型与密码 X 彩虹按:一种高次元的“生命体”,因“事故”被抓来当成“超能源”,其实那不只是“无限的能源”而已,“它”是有意志的!在我们眼里看来,这 ...
- 阿里前DBA的故事
别人怎么享受生活,与你无关.你怎么磨砺与你有头.引用同事周黄江的一句话,很多人努力程度还远没有到拼天赋的时候. 成功的人都是那种目标很明确的人.对于文中厨师的经历很感兴趣.不管是IT还是餐饮,哪个行业 ...
- 从一个例子看现代C++的威力
引子 最近准备重构一下我的kapok库,让meta函数可以返回元素为kv的tuple,例如: struct person { std::string name; int age; META(name, ...
随机推荐
- Centos7 和 Centos8 升级内核
从yum安装kernel-ml 对于Centos7 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org yum install htt ...
- JVM详解
1 JVM运行机制概述 JVM运行机制 类加载机制: 类加载过程由类加载器来完成,即由ClassLoader及其子类实现,有隐式加载和显式加载两种方式.隐式加载是指在使用new等方式创建对象时会隐式调 ...
- js根据输入字符长度自动调整textarea高度
1.编写html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Java并发编程实例--20.使用Semaphores(信号量)控制资源的并发读取
前面我们介绍了2种同步机制: 1)使用synchronized关键字 2)使用Lock接口及其实现类: ReentrantLock,ReentrantReadWriteLock.ReadLock, a ...
- docker清理已停止的容器
docker rm -v $(docker ps -aq -f status=exited) 可以将该命令写成shell脚本或者alias.-v参数表示同时清理数据卷
- 「实操」适配 NebulaGraph 新版本与压测实践
本文来自邦盛科技-知识图谱团队-繁凡,本文以 NebulaGraph v3.1.0 为例. 前言 NebulaGraph v3.1 版本已经发布有一段时间了,但是我们的项目之前是基于 v2.6.1 版 ...
- kotlin协程异常处理之-try catch
kotlin协程小记 协程的async使用 kotlin协程异常处理之-try catch kotlin协程异常处理之-CoroutineExceptionHandler 一.try catch tr ...
- Redis高级数据类型
## 1.Redis相关配置信息 服务器端设定 设置服务器以守护进程的方式运行 daemonize yes|no 绑定主机地址 (只能此ip访问) bind 127.0.0.1 设置服务器端口号 po ...
- CYQ.Data 支持 DaMeng 达梦数据库
DaMeng 达梦数据库介绍: 达梦数据库(DMDB)是中国自主研发的关系型数据库管理系统,由达梦科技股份有限公司开发. 达梦数据库提供了企业级的数据库解决方案,广泛应用于金融.电信.政府.制造等行业 ...
- 2、zookeeper的简单命令
Zookeeper的常用命令本篇不包括权限acl相关以及集群相关,那些要另开篇章.使用的版本是Zookeeper3.4.14,不同版本会有一定的差异性. 节点的存储信息 新增命令 语法:create ...