0

0

Oracle JDBC Template 性能优化:参数化查询速度慢的解决方案

霞舞

霞舞

发布时间:2025-10-17 10:49:14

|

695人浏览过

|

来源于php中文网

原创

oracle jdbc template 性能优化:参数化查询速度慢的解决方案

本文针对在使用 Spring Boot 的 JDBCTemplate 连接 Oracle 数据库时,参数化查询性能大幅下降的问题,提供了一种基于物化视图和定时任务的解决方案。通过创建物化视图并定期刷新,可以显著提升查询速度,解决因参数化查询导致的性能瓶颈

在使用 Spring Boot 的 JDBCTemplate 操作 Oracle 数据库时,开发者可能会遇到一个常见的问题:直接在数据库控制台执行的 SQL 语句速度很快,但通过 JDBCTemplate 进行参数化查询时,性能却大幅下降。例如,一个查询在控制台只需几百毫秒,而通过 JDBCTemplate 加上参数后,耗时可能达到数分钟。

这种性能差异通常是由于 Oracle 数据库的执行计划优化器在处理参数化查询时,无法像处理静态 SQL 语句那样进行有效的优化。即使所有相关的列都已建立索引,也可能无法避免性能瓶颈。

解决方案:使用物化视图

一种有效的解决方案是利用 Oracle 的物化视图(Materialized View)。物化视图是一种预先计算并存储结果的数据库对象,可以显著提高查询速度,尤其是在涉及复杂连接和过滤的查询中。

具体步骤如下:

  1. 创建物化视图: 根据原始查询的逻辑,创建一个物化视图。确保物化视图包含所有需要的列,并使用适当的索引来优化查询。

    例如,对于以下查询:

    SELECT
        CLIENT_EXTRA_INFO.CLIENT_NUMBER,
        CLIENT_EXTRA_INFO.FULL_NAME
    FROM
         CONTRACT
            JOIN CLIENT_EXTRA_INFO on (CONTRACT.CLIENTID = CLIENT_EXTRA_INFO.ID)
    WHERE
        CLIENT_EXTRA_INFO.MBPHONE = :phone
      and CONTRACT.STATUS = 'ACTIVE'
      and CONTRACT.FLAG IN ('2', '5') FETCH  FIRST  :row ROWS ONLY;

    可以创建如下物化视图:

    新快购物系统
    新快购物系统

    新快购物系统是集合目前网络所有购物系统为参考而开发,不管从速度还是安全我们都努力做到最好,此版虽为免费版但是功能齐全,无任何错误,特点有:专业的、全面的电子商务解决方案,使您可以轻松实现网上销售;自助式开放性的数据平台,为您提供充满个性化的设计空间;功能全面、操作简单的远程管理系统,让您在家中也可实现正常销售管理;严谨实用的全新商品数据库,便于查询搜索您的商品。

    下载
    CREATE MATERIALIZED VIEW MV_CLIENT_INFO
    REFRESH COMPLETE START WITH SYSDATE NEXT TRUNC(SYSDATE+1)
    AS
    SELECT
        CLIENT_EXTRA_INFO.CLIENT_NUMBER,
        CLIENT_EXTRA_INFO.FULL_NAME,
        CLIENT_EXTRA_INFO.MBPHONE,
        CONTRACT.STATUS,
        CONTRACT.FLAG,
        CONTRACT.CLIENTID
    FROM
         CONTRACT
            JOIN CLIENT_EXTRA_INFO on (CONTRACT.CLIENTID = CLIENT_EXTRA_INFO.ID);
    
    CREATE INDEX IDX_MV_CLIENT_INFO_PHONE ON MV_CLIENT_INFO (MBPHONE);
    CREATE INDEX IDX_MV_CLIENT_INFO_STATUS ON MV_CLIENT_INFO (STATUS);
    CREATE INDEX IDX_MV_CLIENT_INFO_FLAG ON MV_CLIENT_INFO (FLAG);

    说明:

    • CREATE MATERIALIZED VIEW MV_CLIENT_INFO: 创建名为 MV_CLIENT_INFO 的物化视图。
    • REFRESH COMPLETE START WITH SYSDATE NEXT TRUNC(SYSDATE+1): 指定物化视图的刷新方式为完全刷新(每次刷新都会重新计算整个视图),并设置首次刷新时间为当前时间,下次刷新时间为明天凌晨零点。可以根据实际需求调整刷新频率。
    • AS SELECT ...: 定义物化视图的查询逻辑,与原始查询保持一致。
    • CREATE INDEX ...: 为物化视图的关键列创建索引,进一步提高查询效率。
  2. 修改 JDBCTemplate 查询: 将 JDBCTemplate 中的原始查询替换为基于物化视图的查询。

    @Override
    public ResponsePagingDTO getDuplicateRetailCustomerWithPhoneNumber(DuplicatePhoneNumberRequest request) {
        MapSqlParameterSource mapSqlParameterSource = new MapSqlParameterSource();
        mapSqlParameterSource.addValue("phone", request.getPhoneNumber());
        mapSqlParameterSource.addValue("row", request.getSize());
        String sql ="SELECT\n" +
        "    CLIENT_NUMBER,\n" +
        "    FULL_NAME\n" +
        "FROM\n" +
        "     MV_CLIENT_INFO\n" +
        "WHERE\n" +
        "    MBPHONE = :phone\n" +
        "  and STATUS = 'ACTIVE'\n" +
        "  and FLAG IN ('2', '5') FETCH  FIRST  :row ROWS ONLY";
    
        ResponsePagingDTO responsePagingDTO = new ResponsePagingDTO<>();
    
        List retailCustomerDTOS = new ArrayList<>();
        pulseOpsTemplateJdbc.query(sql, mapSqlParameterSource, (result -> {
            RetailCustomerDTO retailCustomer = new RetailCustomerDTO();
            retailCustomer.setClientNumber(result.getString(ClientConstant.CLIENT_NUM));
            retailCustomer.setFullName(result.getString(ClientConstant.FULL_NAME));
            retailCustomer.setPhoneNumber(request.getPhoneNumber());
            retailCustomerDTOS.add(retailCustomer);
        }));
        responsePagingDTO.setData(retailCustomerDTOS);
        return responsePagingDTO;
    }

    注意:

    • 查询现在直接从 MV_CLIENT_INFO 物化视图中检索数据。
    • WHERE 子句中的条件与原始查询保持一致,但直接作用于物化视图的列。
  3. 定时刷新物化视图: 使用 Oracle 的调度器(Scheduler)创建一个定时任务,定期刷新物化视图。刷新频率取决于数据的更新频率和业务需求。例如,可以每天凌晨刷新一次。

    BEGIN
        DBMS_SCHEDULER.CREATE_JOB (
            job_name        => 'REFRESH_MV_CLIENT_INFO',
            job_type        => 'PLSQL_BLOCK',
            job_action      => 'DBMS_MVIEW.REFRESH(''MV_CLIENT_INFO'', ''C'');',
            start_date      => TRUNC(SYSDATE+1),
            repeat_interval => 'FREQ=DAILY;BYHOUR=0;BYMINUTE=0;BYSECOND=0',
            enabled         => TRUE,
            comments        => 'Refresh MV_CLIENT_INFO daily at 00:00'
        );
    END;
    /

    说明:

    • DBMS_SCHEDULER.CREATE_JOB: 创建一个名为 REFRESH_MV_CLIENT_INFO 的调度任务。
    • job_type => 'PLSQL_BLOCK': 指定任务类型为 PL/SQL 块。
    • job_action => 'DBMS_MVIEW.REFRESH(''MV_CLIENT_INFO'', ''C'');': 定义任务执行的 PL/SQL 代码,即刷新 MV_CLIENT_INFO 物化视图,'C' 表示完全刷新。
    • start_date => TRUNC(SYSDATE+1): 设置任务的首次执行时间为明天凌晨零点。
    • repeat_interval => 'FREQ=DAILY;BYHOUR=0;BYMINUTE=0;BYSECOND=0': 设置任务的重复执行频率为每天凌晨零点。
    • enabled => TRUE: 启用该任务。

注意事项:

  • 物化视图的维护成本: 每次刷新物化视图都会消耗一定的系统资源。因此,需要根据实际情况合理设置刷新频率。
  • 数据一致性: 物化视图中的数据不是实时更新的,存在一定的延迟。如果对数据的实时性要求很高,则需要谨慎使用物化视图。
  • 索引优化: 为物化视图的关键列创建索引,可以进一步提高查询效率。
  • 存储空间: 物化视图会占用额外的存储空间,需要根据数据量和刷新频率合理规划存储空间。

总结:

通过使用物化视图和定时任务,可以有效地解决 Oracle JDBCTemplate 参数化查询性能慢的问题。这种方法通过预先计算并存储结果,显著提高了查询速度,尤其是在涉及复杂连接和过滤的查询中。然而,需要注意物化视图的维护成本和数据一致性问题,并根据实际情况进行合理配置。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

684

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

323

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1117

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

359

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

717

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

577

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

419

2024.04.29

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 3.5万人学习

Java 教程
Java 教程

共578课时 | 49.5万人学习

oracle知识库
oracle知识库

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号