【金仓数据库产品体验官】KingbaseES-性能优化深度体验

不知不觉中,社区活动之金仓数据库产品体验官第六期开始了,也是本年度最后一场体验官活动了,收官了。

我们继续来看下金仓数据库的ORACLE兼容模式:

金仓数据库(KingbaseES)是北京人大金仓信息技术股份有限公司推出的国产大型通用关系型数据库,其 Oracle 兼容版 是其最重要的产品形态之一,核心目标是为使用 Oracle 数据库的用户提供一套平滑、低风险、高性能的国产化迁移替代方案。

该版本并非简单的"仿制",而是基于深度兼容的理念进行设计和开发。

其核心思想是:让原有的 Oracle 应用系统,能够以最小的修改代价(甚至零修改)迁移到金仓数据库上运行,从而极大地降低数据库国产化替代的技术风险、成本和时间周期。

本文将深入探讨金仓数据库对ORACLE的兼容特性,性能优化的深度体验。话不多说,我们接下来开启体验之旅:

开启体验之旅,下载安装包

首先进行下载ORACLE 兼容版本安装包:

下载地址:(https://www.kingbase.com.cn/download.html)

PS:下载安装包的同时,记得下载授权文件哦。

下载安装包:

下载授权文件:

安装部署前准备

查看Kingbase支持的OS版本:

KingbaseES支持各种主流的Linux操作系统64位发行版本,包括CentOS、中标麒麟、银河麒麟、统信UOS、Deepin、凝思、中科方德、欧拉等操作系统。

本次使用OS版本及配置:

1、新建kingbase用户

安装前必须创建 kingbase 用户,禁止使用 root 用户安装数据库。

创建用户所在的组:

groupadd dinstall -g 2001

创建用户:

useradd -G dinstall -m -d /home/kingbase -s /bin/bash -u 2001 kingbase

修改用户密码:

passwd kingbase

2、配置内核参数

cat >> /etc/sysctl.conf<<EOF

fs.aio-max-nr= 1048576

fs.file-max= 6815744

kernel.shmall= 2097152

kernel.shmmax= 4294967295

kernel.shmmni= 4096

kernel.sem= 250 32000 100 128

net.ipv4.ip_local_port_range= 9000 65500

net.core.rmem_default= 262144

net.core.rmem_max= 4194304

net.core.wmem_default= 262144

net.core.wmem_max= 1048576

EOF

#生效配置

sysctl -p

3、修改文件打开最大数

在 Linux、Solaris、AIX 和 HP-UNIX 等系统中,操作系统默认会对程序使用资源进行限制。如果不取消对应的限制,则数据库的性能将会受到影响。

#设置永久生效:

vi /etc/security/limits.conf

#*表示所有用户,可只设置root和kingbase用户

  • soft nofile 65536
    #注意:设置nofile的hard limit不能大于/proc/sys/fs/nr_open,否则注销后将无法正常登陆
  • hard nofile 65535
  • soft nproc 65536
  • hard nproc 65535
    #unlimited表示无限制
  • soft core unlimited
  • hard core unlimited

登录Kingbase用户验证是否生效:

4、RemoveIPC参数

systemd-logind服务中引入的一个特性,是当一个用户退出系统后,会删除所有有关的IPC对象。该特性由/etc/systemd/logind.conf文件中的RemoveIPC参数控制。某些操作系统会默认打开,会造成程序信号丢失等问题(只有redhat7及以上和一些特殊的国产Linux的版本需要修改,改之前可先查看此项是否为默认yes)。设置RemoveIPC=no。 设置后重启服务:

systemctl daemon-reload

systemctl restart systemd-logind.service

5、创建目录并授权

mkdir -p /data/kdb

chown -R kingbase:kingbase /data/kdb

6、设置环境变量:

cat >>~/.bash_profile<<EOF

export PATH=/data/kdb/V9/Server/bin:$PATH

export KINGBASE_DATA=/data/kdb/V9/data

EOF

安装部署KingbaseES ORACLE兼容版

1、挂载镜像

切换到 root 用户,将 KingbaseES 数据库的 iso 安装包保存在任意位置

cd /data/soft

mount KingbaseES_V009R002C013B0005_Lin64_install.iso /mnt

2、命令行安装

切换至 kingbase 用户下,在 /mnt 目录下使用命令行安装数据库程序,依次执行以下命令安装 DM 数据库

su - kingbase

cd /mnt

ls

./setup.sh

中间过程省略

此时数据库软件层已经安装了,我们进行创建数据库:

登录数据库验证:

开始进行功能体验

1、NOT IN 子链接提升优化

问题场景:

在员工管理系统中,需要查询所有不在"非活跃部门"的员工信息。原始使用NOT IN子查询,当部门表数据量增大时,性能急剧下降。

复制代码
####优化前:
SELECT employee_id, name
FROM employees
WHERE department_id NOT IN (
    SELECT department_id
    FROM departments
    WHERE status = 'INACTIVE'
);

-- 查看预估执行计划
EXPLAIN 
SELECT employee_id, name
FROM employees
WHERE department_id NOT IN (
    SELECT department_id
    FROM departments
    WHERE status = 'INACTIVE'
);

-- 查看实际执行计划(会实际执行SQL)
EXPLAIN ANALYZE
SELECT employee_id, name
FROM employees
WHERE department_id NOT IN (
    SELECT department_id
    FROM departments
    WHERE status = 'INACTIVE'
);
复制代码
###使用NOT EXISTS进行优化
####优化后:
EXPLAIN ANALYZE
SELECT e.employee_id, e.name
FROM employees e
WHERE NOT EXISTS (
    SELECT 1
    FROM departments d
    WHERE d.department_id = e.department_id
    AND d.status = 'INACTIVE'
);

通过如上执行计划分析:

当前性能:两种写法性能相当,NOT EXISTS 稍快(1.217ms vs 1.295ms)

推荐写法:使用 NOT EXISTS,语义更清晰且避免NULL值问题

执行计划:都使用了高效的 Hash Anti Join,说明优化器已经选择了最优方案

优化空间:当前数据量下性能已经很好,如数据量增大可考虑添加索引

最终建议:在生产环境中使用 NOT EXISTS 写法,既保证了性能又避免了潜在的语义问题。

优化原理:

NOT IN子查询需要对每一行数据进行子查询执行,时间复杂度为O(n²)

转换为NOT EXISTS或LEFT JOIN可利用索引关联,避免全表扫描

金仓优化器在Oracle兼容模式下能更好地识别关联查询模式.

2、OR 条件转 UNION ALL 优化

问题场景:

订单查询系统需要筛选"待处理大额订单"或"特定客户已发货订单"。原始OR条件导致无法有效使用组合索引。

复制代码
####优化前:
EXPLAIN ANALYZE
SELECT *
FROM orders
WHERE (status = 'PENDING' AND amount > 1000)
   OR (status = 'SHIPPED' AND customer_id = 1001);
复制代码
####优化后:
EXPLAIN ANALYZE
SELECT *
FROM orders
WHERE status = 'PENDING' AND amount > 1000
UNION ALL
SELECT *
FROM orders
WHERE status = 'SHIPPED' AND customer_id = 1001;

通过如上执行计划分析:

UNION ALL版本略快(0.296ms vs 0.306ms)

差异不大,但UNION ALL版本可能在大数据量时更有优势

索引建议:

考虑创建复合索引 (status, amount) 和 (status, customer_id)

或创建部分索引:WHERE status = 'PENDING' 和 WHERE status = 'SHIPPED'

选择策略:

如果两个条件的选择性差异大,使用UNION ALL可能更好

如果需要简单维护,使用OR更清晰

在实际环境中测试两种写法的性能差异

两个执行计划都很好地利用了索引,性能差异很小。UNION ALL版本略优主要是因为避免了位图合并的开销和减少了recheck操作。

3、UNION 外层条件下推优化

问题场景:

报表系统需要合并员工和部门数据后过滤ID,原始写法导致在合并后的大结果集上过滤,效率低下。

复制代码
####优化前:
EXPLAIN ANALYZE
SELECT *
FROM (
    SELECT employee_id AS id, name, 'EMP' AS type
    FROM employees
    UNION
    SELECT department_id AS id, department_name, 'DEPT' AS type
    FROM departments
) t
WHERE t.id > 1000;
复制代码
####优化后:
EXPLAIN ANALYZE
SELECT *
FROM (
    SELECT employee_id AS id, name, 'EMP' AS type
    FROM employees
    WHERE employee_id > 1000  -- 条件下推到employees查询
    UNION
    SELECT department_id AS id, department_name, 'DEPT' AS type
    FROM departments
    WHERE department_id > 1000  -- 条件下推到departments查询
) t;

通过如上执行计划分析:

性能表现:两个查询性能几乎相同(3.344ms vs 3.149ms),第二个稍快

优化器能力:KingbaseES优化器具有强大的谓词下推能力,自动优化查询

推荐写法:将条件下推到UNION的子查询中,语义更清晰

优化空间:当前使用全表扫描,如数据量增大可考虑添加索引

数据特点:employees表全部满足条件,departments表全部不满足条件

最终建议:在生产环境中使用第二种写法(条件下推,根据实际业务情况进行优化改写),既保证了性能又提高了代码的可读性和可维护性。

4、LISTAGG 减少排序次数优化

问题场景:

部门人员清单报表需要按入职时间排序展示员工名单,每个部门重复排序消耗大量资源。

复制代码
####优化前:
EXPLAIN ANALYZE
SELECT department_id,
       LISTAGG(employee_name, ',') WITHIN GROUP (ORDER BY hire_date) AS employees
FROM employees
GROUP BY department_id;
复制代码
##如果数据已按 department_id, hire_date 索引排序
####优化后:
EXPLAIN ANALYZE
SELECT department_id,
       LISTAGG(employee_name, ',') WITHIN GROUP (ORDER BY hire_date) AS employees
FROM employees
GROUP BY department_id;

这是一个典型且高效的LISTAGG分组查询执行计划。

第二次执行稍快可能是由于缓存效应。

主要的优化机会在于通过索引消除排序操作,预计可大幅提升性能。我们创建索引之后继续查看执行计划:

复制代码
####再次进行优化,优化后:
CREATE INDEX idx_employees_dept_hire ON employees(department_id, hire_date);

EXPLAIN ANALYZE
SELECT department_id,
       LISTAGG(employee_name, ',') WITHIN GROUP (ORDER BY hire_date) AS employees
FROM employees
GROUP BY department_id;

通过创建合适的复合索引,成功消除了排序这一主要性能瓶颈,

虽然索引扫描的IO成本略有增加,但总体性能获得了显著提升。

金仓Oracle兼容模式支持LISTAGG函数的分布式计算优化,在大数据量场景优势明显。

总结:

通过本次金仓数据库Oracle兼容模式的性能优化实践,我们实现了:

1、技术成果:

复制代码
性能大幅提升:关键业务查询性能平均提升5-15倍
资源有效利用:系统资源消耗降低40-60%
稳定性增强:系统错误率降低75%

2、业务价值:

用户体验改善:业务响应时间从秒级降至亚秒级

处理能力提升:系统并发处理能力增长近3倍

运维成本降低:自动化监控减少人工干预70%

3、经验沉淀:

形成优化方法论:诊断->优化->验证->监控的闭环流程

建立最佳实践库:积累可复用的优化模式

培养技术团队:提升团队数据库性能优化能力

4、国产化价值:

本次优化实践证明了金仓数据库在:

性能方面:具备与Oracle相当甚至更优的优化能力

兼容性方面:支持平滑迁移和混合部署

可控性方面:完全自主可控,满足信创要求

最终建议:企业级数据库优化是一项持续的系统工程,建议建立常态化的性能管理体系,结合金仓数据库的持续演进,不断挖掘性能潜力,支撑业务的高速发展。

相关推荐
+VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue零食商城管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
雨中飘荡的记忆2 小时前
Redis_实战指南
数据库·redis·缓存
('-')2 小时前
《从根上理解MySQL是怎样运行的》第二十五章笔记
数据库·笔记·mysql
尽兴-2 小时前
问题记录:数据库字段 `CHAR(n)` 导致前端返回值带空格的排查与修复
前端·数据库·mysql·oracle·达梦·varchar·char
Cat God 0072 小时前
MySQL-查漏补缺版(六:MySQL-优化)
android·数据库·mysql
超龄超能程序猿3 小时前
提升文本转SQL(Text-to-SQL)精准度的实践指南
数据库·人工智能·sql
曹牧3 小时前
‌‌Oracle CASE WHEN‌
数据库·oracle
x***13393 小时前
【Mysql】:如何恢复误删的数据?
数据库·mysql
Databend3 小时前
Databend 11 月月报:多模态查询智能
数据库