SQL优化及多数据库支持分享(一)

193 阅读3分钟

「这是我参与11月更文挑战的第 9 天,活动详情查看:2021最后一次更文挑战

1、前言

​ 最近,由于市场机会的原因,有一家客户正在使用的数据库是IBM的DB2,同时还希望能够支持Maria DB。然而现有系统因为历史原因,只支持Oracle,同时ORM层是使用的自己公司基于JDBCTemplate封装的一套框架,并没有使用JPA、MyBatis Plus这些支持数据库方言的。并且在Java代码里面,还充斥着大量的SQL语句。然后在多数据库支持如何解决的问题上,经过领导们一番有力的讨论,最后决定一条SQL语句写3套。(PS:因为改用JPA,改造太大,时间上来不及,同时好多SQL里面大量使用了Oracle独有的函数,并且SQL语句里掺杂着业务..犹如屎山,非常难改)

​ 在实际改造的过程中,我们使用是MariaDB 10.2版本,相当于MySQL5.7,然而在MySQL 8.0之前的版本是不支持开窗函数的!!(PS:关于开窗函数的介绍,大家可以看一下这个网站,介绍的非常详细,适合小白入门:www.begtut.com/mysql/mysql… 。在版本、Oracle独有函数改造、剥离SQL中的业务、慢查询等问题上,着实让我费了不少功夫,绞尽脑汁。接下来的几次分享中,我会给大家详细介绍下上述实际开发中遇到的问题。

​ 本次我会给大家介绍下,如何在本地搭建DB2环境,以及不同数据库之间的数据迁移。

2、搭建DB2环境

​ 这里我还是使用docker来安装db2,我用的版本是11.5.0,下面的安装脚本,大家一键执行即可,这里的DB2INST1_PASSWORD就相当于root用户的密码,DBNAME是我们指定的默认实例数据库。在db2里,一个db2 server可以创建多个实例,一个实例下可以创建多个数据库,每个数据库下又有多个schema,不同的schema之间数据是隔离的。这一点来说,对于刚接触db2的开发来说还是比较懵的。

​ -v 后面是设置的容器数据挂载文件夹,这个参数,大家一定要设置下。设置完后,db2的数据文件就会存在宿主机里,哪怕容器不小心挂掉或者出了问题,我们再重新启动一个容器,设置好同样的挂在文件夹就可再次使用了。

docker run -d -p 50000:50000 --name db2-11.5.0.0 --privileged=true -e DB2INST1_PASSWORD=root -e DBNAME=testdb2 -e LICENSE=accept -v /data/db2:/database ibmcom/db2:11.5.0.0

​ 启动好,docker容器后,我们还需要进入db2容器内,启动我们设置的默认实例。

#进入容器内
docker exec -i -t  db2-11.5.0.0 /bin/bash
#切换到默认的实例用户db2inst1
su - db2inst1
#启动db2默认实例
db2 start
#启动完,可以查看db2运行状态
db2pd -

​ 好了,本次分享就到这里,下一次给大家介绍下,如何进行不同数据库之间的数据迁移。