`

对Oracle 应用分区表的100W条测试

阅读更多

      为验证分区表对检索数据的性能的提升,今天做了100W条数据级的检索和插入的测试。

 

 测试环境:

1. 操作系统和硬件:windows-XP,CPU3.2 双核,3G内存,硬盘500G左右。
2. 软件环境:hibernate3,structs1,ORACLE 10.2 ,weblogic10,JDK6.0

 

测试表:

1.无分区表test

create table TEST
(
  STI_ID                     NUMBER(10) not null,
  STI_STUDENT                NUMBER(19),
  STI_STUDENT_NAME           VARCHAR2(20),
  STI_STUDENT_CARD_ID        CHAR(14) not null,
  STI_STUDENT_CARD_PRINT_NUM VARCHAR2(20),
  STI_COACH                  NUMBER(19),
  STI_COACH_NAME             VARCHAR2(20),
  STI_COACH_CARD_ID          CHAR(14) not null,
  STI_COACH_CARD_PRINT_NUM   VARCHAR2(20),
  STI_SCHOOL                 NUMBER(10),
  STI_SCHOOL_NAME            VARCHAR2(50),
  STI_SCHOOL_SHORT_NAME      VARCHAR2(20),
  STI_COUNTY                 CHAR(6),
  STI_COUNTY_NAME            VARCHAR2(20),
  STI_TRAIN_START_TIME       DATE not null,
  STI_TRAIN_END_TIME         DATE not null,
  STI_TOTAL_TIME             NUMBER(5) default 0,
  STI_TOTAL_MILEAGE          NUMBER(11,1) default 0,
  STI_TOTAL_MONEY            NUMBER(7,2) default 0,
  STI_IS_SIGN_OUT            NUMBER(3) not null,
  STI_APPLY_EXAM_SUBJECT     NUMBER(3),
  STI_TRAIN_SUBJECT          NUMBER(3) not null,
  STI_TRAIN_SUBJECT_NAME     VARCHAR2(50),
  STI_TERMINAL_MACHINE       CHAR(14) not null,
  STI_TERMINAL_PRINT_NUM     VARCHAR2(20),
  STI_UP_TIME                DATE default sysdate not null,
  STI_TERMINAL_DATA_ID       VARCHAR2(20),
  STI_IS_SYNCHRONIZE         NUMBER(3) default 0,
  IS_UP                      CHAR(1) default 0,
  UP_TIME                    DATE,
  UP_COUNT                   NUMBER(3) default 0,
  CS_INNER_NUM               NUMBER(10),
  CS_NAME                    VARCHAR2(50),
  STI_TRAIN_PRICE            NUMBER(5),
  IS_COUNT                   NUMBER(1) default 0,
  IS_COUNT_TIME              DATE,
  STI_IS_TO_WEB              NUMBER(1) default 0
)

 

2.按sti_school分区的表test1

create table TEST1
(
  STI_ID                     NUMBER(10) not null,
  STI_STUDENT                NUMBER(19),
  STI_STUDENT_NAME           VARCHAR2(20),
  STI_STUDENT_CARD_ID        CHAR(14) not null,
  STI_STUDENT_CARD_PRINT_NUM VARCHAR2(20),
  STI_COACH                  NUMBER(19),
  STI_COACH_NAME             VARCHAR2(20),
  STI_COACH_CARD_ID          CHAR(14) not null,
  STI_COACH_CARD_PRINT_NUM   VARCHAR2(20),
  STI_SCHOOL                 NUMBER(10),
  STI_SCHOOL_NAME            VARCHAR2(50),
  STI_SCHOOL_SHORT_NAME      VARCHAR2(20),
  STI_COUNTY                 CHAR(6),
  STI_COUNTY_NAME            VARCHAR2(20),
  STI_TRAIN_START_TIME       DATE not null,
  STI_TRAIN_END_TIME         DATE not null,
  STI_TOTAL_TIME             NUMBER(5) default 0,
  STI_TOTAL_MILEAGE          NUMBER(11,1) default 0,
  STI_TOTAL_MONEY            NUMBER(7,2) default 0,
  STI_IS_SIGN_OUT            NUMBER(3) not null,
  STI_APPLY_EXAM_SUBJECT     NUMBER(3),
  STI_TRAIN_SUBJECT          NUMBER(3) not null,
  STI_TRAIN_SUBJECT_NAME     VARCHAR2(50),
  STI_TERMINAL_MACHINE       CHAR(14) not null,
  STI_TERMINAL_PRINT_NUM     VARCHAR2(20),
  STI_UP_TIME                DATE default sysdate not null,
  STI_TERMINAL_DATA_ID       VARCHAR2(20),
  STI_IS_SYNCHRONIZE         NUMBER(3) default 0,
  IS_UP                      CHAR(1) default 0,
  UP_TIME                    DATE,
  UP_COUNT                   NUMBER(3) default 0,
  CS_INNER_NUM               NUMBER(10),
  CS_NAME                    VARCHAR2(50),
  STI_TRAIN_PRICE            NUMBER(5),
  IS_COUNT                   NUMBER(1) default 0,
  IS_COUNT_TIME              DATE,
  STI_IS_TO_WEB              NUMBER(1) default 0
)
 partition by range (sti_school)
 (
     partition cus_part1 values less than (33030082) ,
     partition cus_part2 values less than (33030122),
     partition cus_part3 values less than (33030142),
     partition cus_part4 values less than (33030162),
     partition cus_part5 values less than (33030242)
 )

 

插入数据库脚本(分两次插入)

package com.www.test.service.impl;

import java.util.Date;

import com.www.test.model.StudentTrainInfo;
import com.www.test.service.testService;
import com.www.util.CommonUtil;

public class testServiceImpl extends BaseService implements
		testService {


	public Integer test() {
		
		System.out.println("=====开始给33030121付值======"+CommonUtil.convertDateToString(new Date(), "yyyy-MM-dd hh:mm:ss"));
		for(int i=0;i<100000;i++){
			StudentTrainInfo studentTrainInfo = new StudentTrainInfo();
			studentTrainInfo.setStudentInnerNum(Long.parseLong("03010000000000"));
			studentTrainInfo.setStudentName("测试");
			studentTrainInfo.setStudentCardInnerNum("03020000000000");
			studentTrainInfo.setStudentCardPrintNum("03030000000000");
			studentTrainInfo.setCoachInnerNum(Long.parseLong("3303000000"));
			studentTrainInfo.setCoachName("测试教练");
			studentTrainInfo.setCoachCardInnerNum("03040000000000");
			studentTrainInfo.setCoachCardPrintNum("03050000000000");
			studentTrainInfo.setSchoolInnerNum(Integer.parseInt("33030121"));
			studentTrainInfo.setSchoolName("温州交通技术学校");
			studentTrainInfo.setCountyCode("330301");
			studentTrainInfo.setCountyName("市辖区");
			studentTrainInfo.setTrainStartTime(new Date());
			studentTrainInfo.setTrainEndTime(new Date());
			studentTrainInfo.setTotalTime(0);
			studentTrainInfo.setTotalMileage(0);
			studentTrainInfo.setTotalMoney(0);
			studentTrainInfo.setIsSignOut(1);
			studentTrainInfo.setApplyExamSubjectInnerNum(2);
			studentTrainInfo.setTrainSubjectInnerNum(61);
			studentTrainInfo.setTrainSubjectName("科目二");
			studentTrainInfo.setTerminalMachineInnerNum("33031100000000");
			studentTrainInfo.setTerminalMachinePrintNum("33031100000000");
			studentTrainInfo.setUploadTime(new Date());
			
			this.getStudentTrainInfoDao().create(studentTrainInfo);
			
		}
		System.out.println("======开始给33030081付值======="+CommonUtil.convertDateToString(new Date(), "yyyy-MM-dd hh:mm:ss"));
		for(int i=0;i<100000;i++){
		 	StudentTrainInfo studentTrainInfo = new StudentTrainInfo();
			studentTrainInfo.setStudentInnerNum(Long.parseLong("03010000000001"));
			studentTrainInfo.setStudentName("测试1");
			studentTrainInfo.setStudentCardInnerNum("03020000000001");
			studentTrainInfo.setStudentCardPrintNum("03030000000001");
			studentTrainInfo.setCoachInnerNum(Long.parseLong("3303000001"));
			studentTrainInfo.setCoachName("测试教练1");
			studentTrainInfo.setCoachCardInnerNum("03040000000001");
			studentTrainInfo.setCoachCardPrintNum("03050000000001");
			studentTrainInfo.setSchoolInnerNum(Integer.parseInt("33030081"));
			studentTrainInfo.setSchoolName("温州娄桥机动车驾驶学校有限公司");
			studentTrainInfo.setCountyCode("330301");
			studentTrainInfo.setCountyName("市辖区");
			studentTrainInfo.setTrainStartTime(new Date());
			studentTrainInfo.setTrainEndTime(new Date());
			studentTrainInfo.setTotalTime(0);
			studentTrainInfo.setTotalMileage(0);
			studentTrainInfo.setTotalMoney(0);
			studentTrainInfo.setIsSignOut(1);
			studentTrainInfo.setApplyExamSubjectInnerNum(2);
			studentTrainInfo.setTrainSubjectInnerNum(61);
			studentTrainInfo.setTrainSubjectName("科目二");
			studentTrainInfo.setTerminalMachineInnerNum("33031100000001");
			studentTrainInfo.setTerminalMachinePrintNum("33031100000001");
			studentTrainInfo.setUploadTime(new Date());
			this.getStudentTrainInfoDao().create(studentTrainInfo);
			
		}
		System.out.println("==================开始给33030161付值=================="+CommonUtil.convertDateToString(new Date(), "yyyy-MM-dd hh:mm:ss"));
		for(int i=0;i<100000;i++){
			StudentTrainInfo studentTrainInfo = new StudentTrainInfo();
			studentTrainInfo.setStudentInnerNum(Long.parseLong("03010000000002"));
			studentTrainInfo.setStudentName("测试2");
			studentTrainInfo.setStudentCardInnerNum("03020000000002");
			studentTrainInfo.setStudentCardPrintNum("03030000000002");
			studentTrainInfo.setCoachInnerNum(Long.parseLong("3303000002"));
			studentTrainInfo.setCoachName("测试教练2");
			studentTrainInfo.setCoachCardInnerNum("03040000000002");
			studentTrainInfo.setCoachCardPrintNum("03050000000002");
			studentTrainInfo.setSchoolInnerNum(Integer.parseInt("33030161"));
			studentTrainInfo.setSchoolName("温州公交集团机动车驾驶员培训学校");
			studentTrainInfo.setCountyCode("330301");
			studentTrainInfo.setCountyName("市辖区");
			studentTrainInfo.setTrainStartTime(new Date());
			studentTrainInfo.setTrainEndTime(new Date());
			studentTrainInfo.setTotalTime(0);
			studentTrainInfo.setTotalMileage(0);
			studentTrainInfo.setTotalMoney(0);
			studentTrainInfo.setIsSignOut(1);
			studentTrainInfo.setApplyExamSubjectInnerNum(2);
			studentTrainInfo.setTrainSubjectInnerNum(61);
			studentTrainInfo.setTrainSubjectName("科目二");
			studentTrainInfo.setTerminalMachineInnerNum("33031100000002");
			studentTrainInfo.setTerminalMachinePrintNum("33031100000002");
			studentTrainInfo.setUploadTime(new Date());
			this.getStudentTrainInfoDao().create(studentTrainInfo);
		}
		System.out.println("=======开始给33030141付值======"+CommonUtil.convertDateToString(new Date(), "yyyy-MM-dd hh:mm:ss"));
		for(int i=0;i<100000;i++){
			StudentTrainInfo studentTrainInfo = new StudentTrainInfo();
			studentTrainInfo.setStudentInnerNum(Long.parseLong("03010000000003"));
			studentTrainInfo.setStudentName("测试3");
			studentTrainInfo.setStudentCardInnerNum("03020000000003");
			studentTrainInfo.setStudentCardPrintNum("03030000000003");
			studentTrainInfo.setCoachInnerNum(Long.parseLong("3303000003"));
			studentTrainInfo.setCoachName("测试教练3");
			studentTrainInfo.setCoachCardInnerNum("03040000000003");
			studentTrainInfo.setCoachCardPrintNum("03050000000003");
			studentTrainInfo.setSchoolInnerNum(Integer.parseInt("33030141"));
			studentTrainInfo.setSchoolName("温州冶金汽车驾驶服务有限公司");
			studentTrainInfo.setCountyCode("330301");
			studentTrainInfo.setCountyName("市辖区");
			studentTrainInfo.setTrainStartTime(new Date());
			studentTrainInfo.setTrainEndTime(new Date());
			studentTrainInfo.setTotalTime(0);
			studentTrainInfo.setTotalMileage(0);
			studentTrainInfo.setTotalMoney(0);
			studentTrainInfo.setIsSignOut(1);
			studentTrainInfo.setApplyExamSubjectInnerNum(2);
			studentTrainInfo.setTrainSubjectInnerNum(61);
			studentTrainInfo.setTrainSubjectName("科目二");
			studentTrainInfo.setTerminalMachineInnerNum("33031100000003");
			studentTrainInfo.setTerminalMachinePrintNum("33031100000003");
			studentTrainInfo.setUploadTime(new Date());
			this.getStudentTrainInfoDao().create(studentTrainInfo);
		}
		System.out.println("==================开始给33030241付值=================="+CommonUtil.convertDateToString(new Date(), "yyyy-MM-dd hh:mm:ss"));
		for(int i=0;i<100000;i++){
			StudentTrainInfo studentTrainInfo = new StudentTrainInfo();
			studentTrainInfo.setStudentInnerNum(Long.parseLong("03010000000004"));
			studentTrainInfo.setStudentName("测试4");
			studentTrainInfo.setStudentCardInnerNum("03020000000004");
			studentTrainInfo.setStudentCardPrintNum("03030000000004");
			studentTrainInfo.setCoachInnerNum(Long.parseLong("3303000004"));
			studentTrainInfo.setCoachName("测试教练4");
			studentTrainInfo.setCoachCardInnerNum("03040000000004");
			studentTrainInfo.setCoachCardPrintNum("03050000000004");
			studentTrainInfo.setSchoolInnerNum(Integer.parseInt("33030241"));
			studentTrainInfo.setSchoolName("浙江交通技师学院");
			studentTrainInfo.setCountyCode("330301");
			studentTrainInfo.setCountyName("市辖区");
			studentTrainInfo.setTrainStartTime(new Date());
			studentTrainInfo.setTrainEndTime(new Date());
			studentTrainInfo.setTotalTime(0);
			studentTrainInfo.setTotalMileage(0);
			studentTrainInfo.setTotalMoney(0);
			studentTrainInfo.setIsSignOut(1);
			studentTrainInfo.setApplyExamSubjectInnerNum(2);
			studentTrainInfo.setTrainSubjectInnerNum(61);
			studentTrainInfo.setTrainSubjectName("科目二");
			studentTrainInfo.setTerminalMachineInnerNum("33031100000004");
			studentTrainInfo.setTerminalMachinePrintNum("33031100000004");
			studentTrainInfo.setUploadTime(new Date());
			this.getStudentTrainInfoDao().create(studentTrainInfo);
		}
		System.out.println("========提交完成======="+CommonUtil.convertDateToString(new Date(), "yyyy-MM-dd hh:mm:ss"));

		return null;
	}

}
 

测试结果:
1.插入数据结果:50W条数据插入时间为2分30秒,其中“==提交完成=”前花费1分30秒,后(hibernate3向数据库提交)时间为1分钟。

2.test和test1单条记录检索时间对比。其中partition(CUS_PART3)存放的是sti_school=33030141的数据,经实测,结果无分区的有分区的结果相差时间为10倍,分区表的检索性能提升显著。

select *  from test1 partition(CUS_PART3)   where  STI_ID=1709850  --首次检索时间:0.234秒

SELECT * FROM test t where t.sti_id=1709850 and t.sti_school=33030141 --首次检索时间:2.454秒

3.对test1查询语句中带partition(CUS_PART3),与不带的性能测试。经实测,说明SQL不带partition(CUS_PART3),用sti_school=33030141的检索速度差不多,用sti_school查询也走分区查询。

select *  from test1 partition(CUS_PART3)   where  STI_ID=1709850  --多次检索后时间:0.062秒

SELECT * FROM test1 t where t.sti_id=1709850 and t.sti_school=33030141 --多次检索后时间:0.063秒
 

测度出现的问题
1.发现一次性循环61W次以上时会出现weblogic内存溢出的问题。weblogic内存配置(-Xms512m -Xmx512m -XX:CompileThreshold=8000 -XX:PermSize=512m -XX:MaxPermSize=1024m -Xverify:none -da);内存配置项,其他三个512内存项配为1024M,会出现weblogic启动不起来的问题。不知为何?

2.当表分区空间没有定义自增长时,对超过10W条记录的插入会出现:oracle 关于无法通过128 表无法扩展相关错误提示,解决方法:修改test表所有的表空间文件为自增长。


 

 

 

分享到:
评论

相关推荐

    oracle分区表之hash分区表的使用及扩展

    Oracle分区表中的Hash分区是一种基于哈希算法的分区策略,适用于处理无法清晰定义分区范围的大型数据表。这种分区方式通过计算分区键的哈希值来决定数据存储在哪个分区,以此达到数据分散和负载均衡的目的。Hash分区...

    oracle普通表转化为分区表的方法

    Oracle数据库中的分区表是一种高级的表组织形式,它将大表分成多个较小的部分,每个部分称为一个分区,以提高查询性能和管理效率。当表的大小超过2GB时,官方推荐使用分区表,因为它们在处理大量数据时具有显著优势...

    Oracle分区表详解

    ### Oracle 分区表详解 #### 一、Oracle 分区简介 Oracle 的分区技术是一种用于管理和优化超大型表和索引的有效手段。通过将一个大型的表或者索引分割成多个较小且可管理的部分,分区技术能够显著提升数据库的性能...

    Oracle数据库分区表操作方法

    Oracle数据库中的分区表是将大型数据表分割成多个小表,以提高应用系统的性能和方便数据管理。在本文中,我们将详细介绍分区表的使用方法和优点。 分区表的优点 使用分区表可以带来以下几个优点: ·增强可用性:...

    oracle创建分区表.pdf

    在Oracle数据库中,分区表是一种高级表设计技术...在实际应用中,还需要考虑分区的策略、维护分区的规则以及可能对应用程序造成的影响。正确使用分区表可以显著提升数据库的性能和可管理性,尤其是在处理大型数据集时。

    Oracle分区表和锁的应用

    在企业级应用中,为了提升数据管理效率和优化查询性能,Oracle提供了分区表这一特性。同时,为了保证数据的一致性和完整性,Oracle的锁机制也是其核心功能之一。下面我们将深入探讨Oracle分区表和锁的应用。 一、...

    Oracle分区表用法

    【Oracle分区表用法】 Oracle分区表是一种高级的数据库管理技术,它将大型表的数据分散存储在不同的物理区域,以提升查询效率和系统的整体性能。本文将详细介绍分区表的概念、作用、优缺点,以及各种类型的分区表...

    oracle表分区详解

    ### Oracle表分区详解 #### 一、概述 Oracle数据库中的表分区是一种高级组织技术,它通过将表的大数据集划分为较小的、更易于管理的部分(即分区),从而提高查询性能和可管理性。表分区可以按照不同的策略进行...

    Oracle分区表培训

    Oracle分区表是数据库管理系统Oracle中的一个高级特性,用于将大表分成较小、更易管理的部分,从而提高查询性能,优化存储管理和数据维护。在大型企业级应用中,尤其是在处理大量数据时,分区表是不可或缺的技术手段...

    oracle 分区表管理

    在Oracle中,对分区表的操作通常更为灵活: 1. **删除数据**:清空整个表的数据使用`TRUNCATE TABLE table_name`;删除分区表特定分区的数据则使用`ALTER TABLE table_name TRUNCATE PARTITION partition_name`。 2...

    Oracle表分区详解(优缺点)

    Oracle 表分区是一种高效的数据管理策略,用于处理大数据量的表,以提升查询性能和数据库的可维护性。本文将详细介绍Oracle表分区的概念、作用、优缺点,以及各种类型的分区和操作方法。 首先,理解表空间和分区表...

    清除oracle分区表数据

    在Oracle数据库管理中,分区表是一种非常实用的功能,它能够帮助优化查询性能并简化大型表的管理。当涉及到批量删除或清除分区表中的数据时,就需要掌握一些特定的方法和技术。根据给定的信息“清除oracle分区表数据...

    oracle分区表总结

    在Oracle数据库中,分区是一种对大型表进行物理分割的方法,它可以显著提高查询性能并简化数据管理任务。通过将一个大表分成多个较小的部分(即分区),可以更快地执行查询操作,尤其是在处理大数据集时。此外,分区...

    导入导出 Oracle 分区表数据

    在Oracle数据库管理中,对分区表进行数据的导入与导出是一项常见的任务。分区技术可以显著提高大型表的性能,尤其是在处理大规模数据集时。为了有效地管理和迁移这些分区表中的数据,Oracle提供了多种工具和技术来...

    利用kettle自动创建oracle表分区

    "利用Kettle自动创建Oracle表分区" 在本篇文章中,将会介绍如何使用Kettle自动创建Oracle表分区。Oracle表分区是一种非常重要的数据库优化技术,它可以将大型表分割成多个小的独立表,从而提高查询效率和数据管理...

    Oracle 分区表 分区索引

    ### Oracle 分区表与分区索引详解 #### 一、Oracle分区概述 在Oracle数据库中,分区技术是一种非常有效的管理大型表和索引的方法。通过将一个大的表或索引分成多个较小的部分(分区),可以显著提高查询性能,并...

    oracle11g expdp impdp 分区表重映射导出导入数据迁移方案

    oracle expdp impdp 分区表重映射导出导入 数据迁移方案,以SI01用户为例子,将用户分区表导出后,将分区表重映射到新的表空间,完成数据迁移和检查。照方案例子按步去做,一定能成功。

    oracle 普通表转分区表方式

    Oracle 普通表转分区表方式 Oracle 分区表(Partitioned Table)是一种特殊的表结构,可以根据不同的条件将数据分割成多个独立的分区,以提高查询效率和减少存储空间。本文将详细介绍将 Oracle 普通表转换为分区表...

    Oracle分区表及分区索引

    Oracle 分区表是指将一个大表分割成多个小表,每个小表称为一个分区,分区表的优点是可以提高查询性能、改善管理型、增强容错性等。 分区表的分类: 1. 范围分区(Range Partitioning) 范围分区是将数据基于范围...

Global site tag (gtag.js) - Google Analytics