`

oracle10 千万级数据存取优化

阅读更多
[list]

     今天对一个存有1000万数据的大表进行了优化,尽是简单的优化,效果很明显。下面把自己的优化经过简单总结备忘一下。
     1:创建表的备份,把生产表的querySql copy后修改table 为temp_tbl
     2:从原有表中copy 数据插入到temp_tbl中语句如下
       insert into temp_tbl select * from source_tbl
     3:查看表数据量
       selct count(1) from temp_tbl
     4:查看表所在空间大小
       select segment_name, bytes/1024/1024/1024 from user_segments
       where segment_NAME = 'TEMP_TBL';
     5:查看当前表索引
       select * from user_indexes where TABLE_Name = 'TEMP_TBL'
     6:利用存储过程做基数数据准备
    
      CREATE OR REPLACE PROCEDURE CASE_ACLINE_TEMP_INSERT
AS
SQL_STMT VARCHAR2(1000) ;
TYPE T_CUR IS REF CURSOR;
V_PCUR T_CUR;
TYPE CASE_IDS_TBL IS TABLE OF CASE_INFO_TEMP.ID%TYPE
INDEX BY PLS_INTEGER;
CASE_IDS CASE_IDS_TBL ;
RESULTCOUNT INTEGER ;
BEGIN
   SQL_STMT := 'SELECT ID FROM CASE_INFO_TEMP WHERE ID > 725' ;
   EXECUTE IMMEDIATE  'SELECT COUNT(1) FROM ('||SQL_STMT||') ' INTO RESULTCOUNT ;
   IF RESULTCOUNT = 0 THEN
      RETURN ;
   END IF ;

   OPEN V_PCUR FOR SQL_STMT;
     FETCH V_PCUR BULK COLLECT INTO CASE_IDS;
     FOR I IN CASE_IDS.FIRST .. CASE_IDS.LAST
     LOOP
     SQL_STMT := 'INSERT INTO CASE_ACLINE_TEMP SELECT ID,NAME,VALID,I_NODE ,';
     SQL_STMT := SQL_STMT || 'J_NODE,I_OFF,J_OFF,NOTE,'||CASE_IDS(I)||',R,X,B,UPDATETIME,I_P,I_Q,';
     SQL_STMT := SQL_STMT || 'J_P,J_Q,I_QC,J_QC FROM CASE_ACLINE WHERE CASE_ID=725' ;
     --DBMS_OUTPUT.PUT_LINE(SQL_STMT);
     EXECUTE IMMEDIATE SQL_STMT ;
     COMMIT ;
   END LOOP;
   CLOSE V_PCUR ;
  
END CASE_ACLINE_TEMP_INSERT;             

     

     7:在java中开启100个线程模拟100个用户 对该表进行单次10000数据插入(前提:temp_tbl     表中存有1000万数据)
[/list]
    
     @Service
public class CaseAclineServiceImpl extends CaseServiceImpl<CaseAcline> implements
		CaseAclineService {
       @Autowired
       private CaseAclineDao aclineDao;
       public void insertTemp(int caseID, CountDownLatch counter) {
		long l1 = System.currentTimeMillis() ;
		this.aclineDao.insertTemp(caseID);
		counter.countDown() ;
		long l2 = System.currentTimeMillis() ;
		System.out.println("编号 "+caseID+ "插入消耗:"+(l2-l1)+"毫秒");
	}
	
	public void queryTemp(int caseID, CountDownLatch counter) {
		long l1 = System.currentTimeMillis() ;
		Query q = new Query() ;
		q.addQueryParam("caseID", caseID) ;
		//PagingResult<CaseAcline> pr = this.aclineDao.queryTemp(q);
		this.aclineDao.insertTemp(caseID);
		//PagingResult<CaseAcline> caseAcline = this.aclineDao.queryTemp(q) ;
		long l2 = System.currentTimeMillis() ;
		System.out.println("编号 "+caseID+ " 查询消耗:"+((l2-l1)/1000)+"秒");
		counter.countDown() ;
		
	}

}


/**   
 * @filename: TestWorker   
 * @description: TODO  
 * @author java 小生 
 * @date 2013-2-27 上午11:32:28      
 */
public class TestWorker extends Thread{
   private CaseAclineService caseAclineService;
   private CountDownLatch counter;
   private int caseID ;
   TestWorker(CaseAclineService caseAclineService,CountDownLatch counter,int caseID ){
	   this.caseAclineService = caseAclineService ;
	   this.counter = counter ;
	   this.caseID = caseID ;
	  
   }
	
   @Override	
   public void run(){
	   //System.out.println(caseID);
	   caseAclineService.queryTemp(caseID, counter);
   }
}

  

/**   
 * @filename: CaseAclineServiceTest   
 * @description: TODO  
 * @author java 小生 
 * @date 2013-2-26 下午11:27:50      
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class CaseAclineServiceTest{
	CountDownLatch counter = new CountDownLatch(100);
	ExecutorService executorService  = Executors.newCachedThreadPool();
	public int caseID = 11796 ;
	
	@Autowired
	private CaseAclineService caseAclineService;
	
	//@Test
	public void doInsert(){
        long l1 = System.currentTimeMillis() ;
		for (int i = 0; i < 100; i++) {
			executorService.submit(new TestWorker(caseAclineService,counter,caseID++));
		}
		try {
			counter.await() ;
		long l2 = System.currentTimeMillis() ;
			System.out.println("100个线程插入完成,耗时:"+((l2-l1)/1000)+" 秒");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	@Test
	public void doQuqery(){
        long l1 = System.currentTimeMillis() ;
        for (int i = 0; i < 100; i++) {
			executorService.submit(new TestWorker(caseAclineService,counter,caseID++));
		}
		try {
			counter.await() ;
		long l2 = System.currentTimeMillis() ;
			System.out.println("100个线程查询完成,耗时:"+((l2-l1)/1000)+" 秒");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

     
 


         8:插入操作情况如下
       峰值 内存占用达85% ,上下文切换较高 , 100次插入,成功96 ,失败4个

         耗时(秒) 线程数
         0-60 17
         0-70 31
         0-100 48
         成功 96
        
      利用hints  /*+APPEND*/ 做插入,不删除外键索引 ,执行情况如下:
         耗时(秒) 线程数
         0-10 35
         0-20 41
         0-30 24
         成功 100
      
        去掉外键索引后的执行情况如下:
         耗时(秒) 线程数
         0-1 8
         0-2 12
         0-3 24
         0-4 43
         0-5 13
        成功 100

         8:100个线程做关联查询查询操作(单次查询数据位10000)情况如下
         没有添加任何索引的查询结果
         耗时(秒) 线程数
         0-40 13
         0-50 70
         0-60 17
      
         添加索引后 100个线程都在1秒内完成查询操作
      
      


         总结:为了提高插入速度 用刀了hints 中的/*+APPEND*/  从表中末尾追加,避免对索引过多维护消耗时间;
               为了提高查询的速度,增加了一个外键索引。



         对于hint 和索引的细节 还请百度 或是google ,小生了解有限。





      
分享到:
评论

相关推荐

    oracle千万级别数据简单操作

    ### Oracle千万级别数据简单操作详解 #### 一、创建表空间与分区表 在Oracle数据库中处理千万级别的数据时,合理的表空间管理和分区策略是非常重要的。以下是从给定的部分内容中提取的关键步骤: 1. **创建表空间...

    Oracle_数据库中的海量数据处理

    #### Oracle Database Machine:硬件级数据仓库支持 Oracle Database Machine是专门为运行Oracle数据库而设计的高性能硬件平台,集成了Sun服务器和InfiniBand网络技术,专为数据仓库和OLTP应用程序提供强大支持。 ...

    数据库迁移 数据迁移 千万级 亿万级数据MySQL oracle关系型

    现需要开发一套程序用来快速迁移数据库,要求如下: 1.使用人员可以指定迁移数据库类型 如:(orcal,sqlServer,csv 迁移至mysql) 2.在迁移数据库时,可以只迁移指定字段. ...4.保护数据完整性,设计失败处理

    基于Oracle数据库与ArcSDE的空间数据存取优化.pdf

    【基于Oracle数据库与ArcSDE的空间数据存取优化】 随着空间信息技术的快速发展,Oracle数据库作为关系型数据库的重要代表,其规模不断扩大,存储空间数据的需求日益增长。为了应对海量空间数据的管理和高效存取,...

    Oracle 大数据量操作性能优化

    Oracle 大数据量操作性能优化 Oracle大数据量操作性能优化是指在处理大量数据时,如何提高 Oracle 数据库的性能。该优化技术涉及到多个方面,包括分区、Direct Insert、并行和排序处理等。 分区是 Oracle 中的一种...

    基于Oracle数据库的数据存取性能优化初探.pdf

    基于Oracle数据库的数据存取性能优化初探.pdf

    update语句的优化-oracle .pdf

    在处理大型数据库,尤其是当数据量达到百万级甚至千万级时,Oracle数据库的性能优化显得尤为重要。在本篇文档中,作者详细总结了在实际项目中针对Oracle数据库的update语句优化的四种方案。以下是对这四种方案的知识...

    Oracle 10g数据库海量数据分页查询优化.pdf

    Oracle 10g 数据库海量数据分页查询优化 本文主要介绍 Oracle 10g 数据库中的一种优化的海量数据分页查询解决方案。该方案通过分析传统分页查询技术的不足,融合了多种技术,包括数据库优化策略、SQL 语句优化、...

    Oracle数据库大对象数据存取的两种实现方法及时间性能比较.pdf

    标题中的“Oracle数据库大对象数据存取的两种实现方法及时间性能比较”指的是在Oracle数据库中处理大对象(LOB)数据的两种不同方法,并对比它们的性能。Oracle数据库中的大对象数据通常指的是非结构化的数据,如...

    java快速插入千万级数据

    java快速插入千万级数据,亲测91秒插入1700万数据!!!

    oracle分页存储过程千万级

    在Oracle数据库管理中,处理千万级别的数据记录时,性能优化变得尤为重要。对于大规模数据集的分页查询,传统的SQL查询方式可能无法满足高效性与响应速度的要求,因此,设计并实现一个高效的存储过程来实现分页功能...

    oracle数据仓库国宝级资料(全套)

    oracle数据仓库国宝级资料(全套) 1、Oracle+10g数据仓库实践--数据仓库基础.pdf 2、Oracle+10g数据仓库实践--总体方案.pdf 3、Oracle+10g数据仓库实践--方案的总体优势.pdf 4、Oracle+10g据仓库实践--数据仓库工具的...

    让Oracle跑得更快—Oracle 10g性能分析与优化思路ch03.pdf

    ### Oracle 10g性能分析与优化:深入理解Latch及其优化策略 #### 一、Latch与Lock的区别 在Oracle数据库的性能优化过程中,理解和区分Latch与Lock是非常重要的。两者虽然都涉及资源的控制和访问,但其作用机制和对...

    Oracle导Mysql适用于百、千万级别数据迁移

    Oracle导Mysql适用于百、千万级别数据迁移,速度是kettle的10倍以上数据库迁移 数据迁移 千万级 亿万级数据,MySQL oracle关系型 现需要开发一套程序用来快速迁移数据库,要求如下: 1.使用人员可以指定迁移数据库...

    Oracle查询优化技巧

    Oracle查询的优化技巧,对大数据量查询的时候可以节省不少时间。

    Oracle10g 数据仓库

    8. **分区(Partitioning)**:Oracle10g支持多种分区策略,如范围、列表、哈希和复合分区,便于管理和优化大规模数据表。 9. **物化视图(Materialized Views)**:物化视图可以预先计算并存储复杂查询的结果,...

    Oracle表删除大量数据(千万)后查询变慢问题(原因分析)

    在 Oracle 数据库中,如果删除了大量数据(千万级别),可能会出现查询变慢的问题。下面我们将分析这个问题的原因,并提供解决方案。 问题的原因主要有两个方面: 1. 表空间的增长:当删除大量数据后,表空间可能...

    Oracle 10g性能优化.pdf

    《Oracle 10g性能优化》一书深入探讨了如何在Oracle 10g数据库环境中实现性能优化,针对企业级应用中的常见问题提供了一系列实用的解决方案。以下是对该主题的关键知识点进行的详细解读: ### 1. Oracle Database ...

    Oracle大数据量操作优化

    Oracle大数据量操作优化

Global site tag (gtag.js) - Google Analytics