oracle导出数据特别慢_Oracle 大最插入数据 一段时间之后变慢问题解决方法

因为系统业务需要,需要从数据中心导入12年的历史数据到系统。每天平均1000千左右。有一个表有200多个字段,基中还包括几个clob字段。导入方式是用http向服务器一天一天的请求数据。每次请求一天。不能请求太多天,因为服务器请求太多天,有可能返回不了数据。导致失败,Java的JDBC接口写入。每次写数据都是一条一条的写入。刚开始还算顺利,接口过来的数据都能写入进数据库。但问题出现在写入1个月数据左右就开始慢慢的出现卡顿的情况。写入一条记录的数据,有时10几秒,有几几分钟。最坏的时候,就一条数据几个小时还没有写入成功,导致整个同步进程严重拥堵。每次卡死之后,重启数据库服务又可以正常写入。但每次写入一段时候之后,又卡死。

试过以下方法都不见效:

1、停止所有的触发器

2、接收数据表使用nologging表。

3、分次提交,一次不要只提交一条记录。一次提交一天记录。

最后在网上找到了解决方法。也是分次提交,但不是使用executeUpdate()执行,而是使用了先addBatch(), 再executeBatch()的方式。

具体见代码中的:    public int executeBatch(String sql, List params) 方法。

附操作数据库的代码

package bh.ojdbc.util;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.apache.log4j.Logger;

import bh.getjzdata.Para;

import bh.util.SetRW;

import bh.util.Tool;

/**

* 对jdbc的完整封装

*

*/

public class JDBCUtil {

private static Logger logger = Logger.getLogger(JDBCUtil.class);

private static String driver = null;

private static String url = null;

private static String username = null;

private static String password = null;

private CallableStatement callableStatement = null;//创建CallableStatement对象

private Connection conn = null;

private PreparedStatement pst = null;

private ResultSet rst = null;

/*static {

try {

// 加载数据库驱动程序

Class.forName(driver);

} catch (ClassNotFoundException e) {

System.out.println("加载驱动错误");

System.out.println(e.getMessage());

}

} */

public JDBCUtil(){

this.driver = Para.oracle_driver;

this.url = Para.oracle_url;

this.username = Para.oracle_userid;

this.password = Para.oracle_password;

}

public JDBCUtil(String driver,String url ,String username,String password) {

this.driver = driver;

this.url = url;

this.username = username;

<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle中的索引是一种用于加快查询速度的数据结构,它存储了表中某些列的值以及相应的行位置信息。当我们对索引字段插入大量数据后再进行删除操作时,可能会导致查询变慢的原因如下: 1. 索引的更新:当我们插入和删除数据时,索引需要被更新以反映最新的数据变化。插入大量数据会导致索引的更新操作变得复杂和耗时,尤其是如果索引本身比较大或者是多列组合索引。 2. 索引碎片化:当我们删除数据时,索引中会产生空洞,这些空洞可能会导致索引的碎片化。碎片化的索引可能导致查询时需要扫描更多的数据块,从而降低查询性能。 3. 统计信息的更新:Oracle使用统计信息来确定查询使用哪个索引以及查询计划的选择。当我们插入大量数据并删除后,统计信息可能会变得不准确或过时,导致查询计划的选择不合理,从而影响查询性能。 针对以上问题,我们可以采取以下措施来提高查询性能: 1. 定期重建索引:在删除大量数据后,可以通过重建或重新组织索引来降低碎片化。这样可以减少查询时需要扫描的数据块数量,提高查询性能。 2. 更新统计信息:定期更新表的统计信息可以确保Oracle选择合适的查询计划。可以通过收集统计信息或使用自动任务来更新统计信息。 3. 合理管理事务:对于大量数据插入和删除操作,可以考虑使用批量提交或分批处理的方式,减少索引的更新次数,以及优化事务提交的频率。 4. 调整查询SQL:可以通过优化查询SQL语句,例如添加合适的索引提示或使用更适合的索引,来提高查询性能。 总之,当我们在Oracle中对索引字段插入大量数据后再进行删除操作时,需要注意索引的更新和碎片化问题,以及统计信息的准确性,采取相应的措施来维护和优化索引,从而提高查询性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值