暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

万里数据库 2025-10-28
158

—技术干货—

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 0, 10;


          重要提醒: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国产替代第一品牌


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

          文章转载自万里数据库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论