关于报表里SQL执行速度的问题

本文探讨了一位客户反映的报表计算慢的问题,主要原因是SQL执行速度。通过对比,发现在报表系统中和直接在数据库端执行SQL有显著差异,特别是对于带参数的SQL。为了解决这个问题,建议客户使用Java的PreparedStatement模拟带参数SQL执行,以证明执行时间与报表系统中的接近。文中提供了具体代码示例进行说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 问题概述
之前有个客户反应报表计算慢,通过看后台日志,发现时间都是花在了执行sql上面,但同时客户会说,这个sql拿到数据库端去执行,速度很快,对于含参数的sql,执行时间的差异会显得尤为明显.但是,客户将sql拿到数据库端去执行,往往是模拟不了传参的过程,检索条件都是在sql里写死的.
2. 解决办法
为了证明这个sql执行速度慢,不是润乾的关系,可以建议客户写一段java代码,不调用润乾的任何接口,采用PreparedStatement执行这个sql,这样客户会发现,即使不用润乾,执行一个带参数的sql所花的时间与报表里所花时间是差不多的.
同一张表,同样的条件,详见代码里query1,query2方法
A: 条件直接写在SQL语句上,执行结果

B: 条件传递在SQL语句上,执行结果

3. 程序代码

package api;

import java.sql.*;

publicclass TestSQL {

    public TestSQL() {

    }

    publicstaticvoid main(String[] args){

       query1();

       query2();

    }

publicstaticvoid query1(){

       Connection conn = null;

       PreparedStatement stat = null;

       ResultSet rs = null;

       try {

           Class.forName("com.newatlanta.jturbo.driver.Driver");//数据库驱动

           conn = DriverManager.getConnection(

              "jdbc:JTurbo://127.0.0.1/DBA/charset=GBK", "sa ", "sa");

           String sql_noParam = "SELECT *  FROM 订单明细 where 单价 > 10";

           //直接写定参数的SQL语句

           stat = conn.prepareStatement(sql_noParam);

           long startTime = System.currentTimeMillis();

           System.out.println("query1   begin   time: " + startTime);

           rs = stat.executeQuery();

           while (rs.next()) {

              //遍历一遍结果集,这个循环可以去掉

           }

           long costTime = System.currentTimeMillis() - startTime;

           System.out.println("Query1 cost time: " + (costTime/1000) + "s" + (costTime%1000) + "ms");

       }

       catch (Exception e) {

           e.printStackTrace();

       }

       finally {

           //任务结束,关闭连接、结果集等项

           try {

              if ( rs != null ) rs.close();

              if ( stat != null ) stat.close();

              if (conn != null ) conn.close();

           }

           catch (SQLException e) {

              e.printStackTrace();

           }

       }

    }

 

    publicstaticvoid query2(){

       Connection conn = null;

       PreparedStatement stat = null;

       ResultSet rs = null;

       try {

           Class.forName("com.newatlanta.jturbo.driver.Driver");

           conn = DriverManager.getConnection(

              "jdbc:JTurbo://127.0.0.1/DBA/charset=GBK", "sa ", "sa");

           String sql_withParam = "SELECT *  FROM 订单明细 where 单价 > ?";

           //带参数sql

           stat = conn.prepareStatement(sql_withParam);

           stat.setInt(1, 10);//设定第一个参数为Int,值为10,其它类型用stat.setString,stat.setTimestamp等等

           long startTime = System.currentTimeMillis();

           System.out.println("query2   begin   time: " + startTime);

           rs = stat.executeQuery();

 

           while (rs.next()) {

              //遍历一遍结果集,这个循环可以去掉

           }

           long costTime = System.currentTimeMillis() - startTime;

           System.out.println("Query2 cost time: " + (costTime/1000) + "s" + (costTime%1000) + "ms");

       }

       catch (Exception e) {

           e.printStackTrace();

       }

       finally {

           try {

              if ( rs != null ) rs.close();

              if ( stat != null ) stat.close();

              if (conn != null ) conn.close();

           }

           catch (SQLException e) {

              e.printStackTrace();

           }

       }

    }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值