大数跨境
0
0

技术干货 | Oracle迁移至GreatSQL性能瓶颈破解:高效分页查询实战优化指南

技术干货 | Oracle迁移至GreatSQL性能瓶颈破解:高效分页查询实战优化指南 万里数据库
2025-10-27
0

—技术干货—

Oracle迁移至GreatSQL

性能瓶颈破解

随着国产化替代进入深水区,大量基于Oracle的核心业务系统正在平滑迁移至GreatSQL。GreatSQL凭借其对Oracle语法的高度兼容,极大地降低了迁移门槛与改造成本。


然而,语法兼容并非性能最优的“直通车”。本文将聚焦数据库中最常见的高频操作——分页查询,通过详实的案例,深入剖析Oracle风格写法在GreatSQL下的性能表现,并为您揭晓如何充分发挥GreatSQL的架构优势,实现分页查询性能的数量级提升。

01#




语法兼容下的“性能陷阱”

从Oracle到GreatSQL的分页变迁

1、Oracle的经典三层嵌套查询

在Oracle 12c之前,开发者通常需要借助ROWNUM伪列,通过三层嵌套查询实现分页,写法复杂且不易理解。


SELECT *  FROM (SELECT t.*, ROWNUM rn          FROM (SELECT * FROM t_pagequery ORDER BY log_time DESC) t         WHERE ROWNUM <= 10) WHERE rn > 0;


核心痛点:此写法在GreatSQL中虽可正常运行,但由于ROWNUM的兼容性实现机制,会导致无法利用索引进行排序,从而在底层触发全表扫描与文件排序(Using filesort),为大表查询埋下性能隐患。


2. GreatSQL的原生高效写法

GreatSQL提供了更符合现代SQL标准的LIMIT子句,实现相同功能只需一层查询,简洁直观。


SELECT t.* FROM t_pagequery t ORDER BY log_time DESC LIMIT 0,10;


如需生成行号,可使用窗口函数

SELECT t.*,ROW_NUMBER() OVER() rn FROM t_pagequery t ORDER BY log_time DESC LIMIT 0,10;

02#




实验为证

性能差距究竟有多大?

我们通过一个包含10万行数据的测试表(t_pagequery),在相同环境下进行性能对比。


1.性能耗时对比


查询方案

执行时间

性能结论

Oracle兼容写法

0.14

较慢,存在优化空间

GreatSQL原生写法

0.00

性能极致,快一个数量级


2. 执行计划深度解读(关键发现)


Oracle写法执行计划:

  • 显示type: ALL(全表扫描)

  • 额外信息Using filesort(文件排序)

  • 结论:即使只请求10行数据,数据库仍需要处理全部10万行数据并进行排序,资源消耗巨大。


GreatSQL原生写法执行计划:

  • 显示type: index(索引扫描)

  • 关键信息Backward index scan(倒序索引扫描)

  • 结论:GreatSQL直接逆向遍历索引,仅读取所需的10行数据后立即返回,效率极高。


技术点睛:Backward index scan是GreatSQL优化器的核心能力之一,对于ORDER BY ... DESC LIMIT这类查询,能够精准定位数据,避免不必要的IO与计算。

03#




 攻坚克难

Oracle模式下的优化秘籍

在实际迁移中,为保障兼容性,我们常将sql_mode设置为Oracle模式。但此模式下,即使是GreatSQL原生写法,默认也无法使用索引。


解决方案:通过语句级Hint,在查询中临时切换sql_mode,即可“解锁”索引性能。


-- 使用Hint临时指定sql_mode,重获索引性能SELECT /*+ SET_VAR(sql_mode='ONLY_FULL_GROUP_BY') */        t.*ROW_NUMBER() OVER () AS rn FROM t_pagequery t ORDER BY log_time DESC LIMIT 010;


重要提醒:Hint中的sql_mode不能设置为空串(''),必须指定一个明确的有效模式(如TRADITIONAL, ONLY_FULL_GROUP_BY等)。

04#




GreatSQL架构优势

为何我们能更高效?

除了优化器强大,GreatSQL在索引底层设计上也更具优势:


特性对比

Oracle

GreatSQL

NULL值索引

索引列全为NULL时,记录不入索引

记录全部入索引,因索引包含主键

默认排序

NULL值排在最后

NULL值排在最前

索引排序约束

需额外条件(如IS NOT NULL)或联合索引才能利用索引排序

无需额外处理,可直接利用索引排序



这意味着,在GreatSQL中,对于包含NULL值的列进行排序,开发者无需增加IS NOT NULL等冗余条件,即可享受索引带来的性能红利,简化了SQL写法并提升效率。

05#




总结与最佳实践


  • 性能优先,主动优化:对于从Oracle迁移的应用,建议将分页查询主动改写为GreatSQL原生LIMIT写法,这是性能提升的最直接路径;

  • 兼容性场景的智慧:在必须使用Oracle语法的场景下,通过Hint动态调整sql_mode,是兼顾兼容性与性能的银弹方案;

  • 善用架构红利:了解并利用GreatSQL在索引设计上的优势,可以在众多细节上累积性能收益,让数据库跑得更快、更稳。


通过本次实战可以看到,GreatSQL不仅在语法兼容上为数据库迁移保驾护航,更在核心性能上凭借其卓越的架构设计,为业务系统注入了新的活力。选择GreatSQL,意味着同时选择了平滑迁移与性能跃升的双重价值。

技术干货 | Oracle迁移到GreatSQL  因排序规则改变引发的乱码问题怎么破?

技术干货 | GreatSQL连接数被打满的3种紧急解决方案

技术干货 | dbops 助力GreatSQL安装部署

图片
关于万里数据库
图片


北京万里开源软件有限公司(简称“万里数据库”)成立于2000年,是专注于国产自主可控数据库产品研发的国家高新技术企业、国家级专精特新“小巨人”企业,拥有发明专利、软件著作权百余项。


万里数据库的技术底蕴源自对底层核心代码的掌控,产品始终坚持以“极致稳定、极致性能、极致易用”为目标,经过20余年的研发经验积累,产品在功能、性能、稳定、易用等方面均处于行业领先水平,广泛应用于金融、运营商、能源、政府、交通等行业重要业务系统中的超2000个业务场景,得到了用户和市场的认可与肯定。


2021年,公司创立GreatSQL开源社区,通过对MySQL技术的优化,目前已成长为国内活跃的自主开源数据库社区


图片
MySQL国产替代第一品牌


“在看”点一下,万里早知道

【声明】内容源于网络
0
0
万里数据库
北京万里开源软件有限公司
内容 500
粉丝 0
万里数据库 北京万里开源软件有限公司
总阅读427
粉丝0
内容500