-----本次只做插入.看看怎么插入速度快
准备工作
--数据文件 alter system set db_create_file_dest='d:\toby\oracle\data'; --表空间 create tablespace ts_sales_200901 datafile size 5M autoextend on ; create tablespace ts_sales_200902 datafile size 5M autoextend on ; create tablespace ts_sales_200903 datafile size 5M autoextend on ; create tablespace ts_sales_200904 datafile size 5M autoextend on ; create tablespace ts_sales_200905 datafile size 5M autoextend on ; create tablespace ts_sales_200906 datafile size 5M autoextend on ; create tablespace ts_sales_200907 datafile size 5M autoextend on ; create tablespace ts_sales_200908 datafile size 5M autoextend on ; create tablespace ts_sales_200909 datafile size 5M autoextend on ; create tablespace ts_sales_200910 datafile size 5M autoextend on ; create tablespace ts_sales_200911 datafile size 5M autoextend on ; create tablespace ts_sales_200912 datafile size 5M autoextend on ; create tablespace ts_sales_201001 datafile size 5M autoextend on ; create tablespace ts_sales_201002 datafile size 5M autoextend on ; create table city( city_id number(10), city nvarchar2(30), primary key(city_id) ); create table employee( EMPLOYEE_ID number(10), FIRST_NAME nvarchar2(30), LAST_NAME nvarchar2(30), MANAGER_ID number(10), primary key(EMPLOYEE_ID) ); --- insert city --id 从1到24 INSERT INTO CITY SELECT ROWNUM,CITY FROM HR.LOCATIONS; -- insert employee --id 从100到206 insert into employee select EMPLOYEE_ID,FIRST_NAME,LAST_NAME,MANAGER_ID FROM HR.EMPLOYEES; ---分区表 create table sales_data( sales_date date, city_id number(10), employee_id number(10), sales_type nvarchar2(30), sales_amount number(10) )partition by range (sales_date) ( partition sales_200901 values less than (to_date('2009-02-01','YYYY-MM-DD')) tablespace ts_sales_200901, partition sales_200902 values less than (to_date('2009-03-01','YYYY-MM-DD')) tablespace ts_sales_200902, partition sales_200903 values less than (to_date('2009-04-01','YYYY-MM-DD')) tablespace ts_sales_200903, partition sales_200904 values less than (to_date('2009-05-01','YYYY-MM-DD')) tablespace ts_sales_200904, partition sales_200905 values less than (to_date('2009-06-01','YYYY-MM-DD')) tablespace ts_sales_200905, partition sales_200906 values less than (to_date('2009-07-01','YYYY-MM-DD')) tablespace ts_sales_200906, partition sales_200907 values less than (to_date('2009-08-01','YYYY-MM-DD')) tablespace ts_sales_200907, partition sales_200908 values less than (to_date('2009-09-01','YYYY-MM-DD')) tablespace ts_sales_200908, partition sales_200909 values less than (to_date('2009-10-01','YYYY-MM-DD')) tablespace ts_sales_200909, partition sales_200910 values less than (to_date('2009-11-01','YYYY-MM-DD')) tablespace ts_sales_200910, partition sales_200911 values less than (to_date('2009-12-01','YYYY-MM-DD')) tablespace ts_sales_200911, partition sales_200912 values less than (to_date('2010-01-01','YYYY-MM-DD')) tablespace ts_sales_200912, partition sales_201001 values less than (to_date('2010-02-01','YYYY-MM-DD')) tablespace ts_sales_201001, partition sales_201002 values less than (to_date('2010-03-01','YYYY-MM-DD')) tablespace ts_sales_201002 ); --分区索引放在对应表空间 create index index_sales_data_partition on sales_data (sales_date) local ( partition sales_200901 tablespace ts_sales_200901, partition sales_200902 tablespace ts_sales_200902, partition sales_200903 tablespace ts_sales_200903, partition sales_200904 tablespace ts_sales_200904, partition sales_200905 tablespace ts_sales_200905, partition sales_200906 tablespace ts_sales_200906, partition sales_200907 tablespace ts_sales_200907, partition sales_200908 tablespace ts_sales_200908, partition sales_200909 tablespace ts_sales_200909, partition sales_200910 tablespace ts_sales_200910, partition sales_200911 tablespace ts_sales_200911, partition sales_200912 tablespace ts_sales_200912, partition sales_201001 tablespace ts_sales_201001, partition sales_201002 tablespace ts_sales_201002 ); ---位图 create bitmap index index_sales_data_sales_type on sales_data (sales_type) local ; --位图连接 create bitmap index index_sales_data_city on sales_data (city.city_id) from sales_data,city where sales_data.city_id=city.city_id local ; ---分区表 但不建位图 create table sales_data1( sales_date date, city_id number(10), employee_id number(10), sales_type nvarchar2(30), sales_amount number(10) )partition by range (sales_date) ( partition sales_200901 values less than (to_date('2009-02-01','YYYY-MM-DD')) tablespace ts_sales_200901, partition sales_200902 values less than (to_date('2009-03-01','YYYY-MM-DD')) tablespace ts_sales_200902, partition sales_200903 values less than (to_date('2009-04-01','YYYY-MM-DD')) tablespace ts_sales_200903, partition sales_200904 values less than (to_date('2009-05-01','YYYY-MM-DD')) tablespace ts_sales_200904, partition sales_200905 values less than (to_date('2009-06-01','YYYY-MM-DD')) tablespace ts_sales_200905, partition sales_200906 values less than (to_date('2009-07-01','YYYY-MM-DD')) tablespace ts_sales_200906, partition sales_200907 values less than (to_date('2009-08-01','YYYY-MM-DD')) tablespace ts_sales_200907, partition sales_200908 values less than (to_date('2009-09-01','YYYY-MM-DD')) tablespace ts_sales_200908, partition sales_200909 values less than (to_date('2009-10-01','YYYY-MM-DD')) tablespace ts_sales_200909, partition sales_200910 values less than (to_date('2009-11-01','YYYY-MM-DD')) tablespace ts_sales_200910, partition sales_200911 values less than (to_date('2009-12-01','YYYY-MM-DD')) tablespace ts_sales_200911, partition sales_200912 values less than (to_date('2010-01-01','YYYY-MM-DD')) tablespace ts_sales_200912, partition sales_201001 values less than (to_date('2010-02-01','YYYY-MM-DD')) tablespace ts_sales_201001, partition sales_201002 values less than (to_date('2010-03-01','YYYY-MM-DD')) tablespace ts_sales_201002 ); --分区索引放在对应表空间 create index index_sales_data_partition_1 on sales_data1 (sales_date) local ( partition sales_200901 tablespace ts_sales_200901, partition sales_200902 tablespace ts_sales_200902, partition sales_200903 tablespace ts_sales_200903, partition sales_200904 tablespace ts_sales_200904, partition sales_200905 tablespace ts_sales_200905, partition sales_200906 tablespace ts_sales_200906, partition sales_200907 tablespace ts_sales_200907, partition sales_200908 tablespace ts_sales_200908, partition sales_200909 tablespace ts_sales_200909, partition sales_200910 tablespace ts_sales_200910, partition sales_200911 tablespace ts_sales_200911, partition sales_200912 tablespace ts_sales_200912, partition sales_201001 tablespace ts_sales_201001, partition sales_201002 tablespace ts_sales_201002 ); --一模一样的不分区表 create table sales_data2( sales_date date, city_id number(10), employee_id number(10), sales_type nvarchar2(30), sales_amount number(10) ); --一模一样的不分区表2 create table sales_data3( sales_date date, city_id number(10), employee_id number(10), sales_type nvarchar2(30), sales_amount number(10) ); set serveroutput on ---插入数据 1千万 DECLARE MAXRECORDS CONSTANT INT:=10000000; sales_date int:=0 ; sales number:=0; I INT :=1; city_id int:=0 ; employee_id int:=0; sales_date1 nvarchar2(20):=''; sales_month int:=0 ; begin FOR I IN 1..MAXRECORDS LOOP CITY_ID:= ABS(MOD(DBMS_RANDOM.RANDOM,24)); employee_id:=ABS(MOD(DBMS_RANDOM.RANDOM,106))+100; SALES_DATE:=ABS(MOD(DBMS_RANDOM.RANDOM,28)); sales_month :=ABS(MOD(DBMS_RANDOM.RANDOM,5)); --保证不为0 while city_id=0 or SALES_DATE=0 or sales_month=0 loop CITY_ID:= ABS(MOD(DBMS_RANDOM.RANDOM,24)); sales_month :=ABS(MOD(DBMS_RANDOM.RANDOM,5)); SALES_DATE:=ABS(MOD(DBMS_RANDOM.RANDOM,28)); end loop; sales:=ABS(MOD(DBMS_RANDOM.RANDOM,100000)); sales_date1:='2009-0'||to_char(sales_month)||'-'||to_char(sales_date); INSERT INTO SALES_DATA3 VALUES (to_date(sales_date1,'YYYY-MM-DD'),city_id,employee_id,'toby',sales); end loop; dbms_output.put_line('done!'); commit; end;
现在 SALES_DATA3 有1千万数据,分布在1到5月之间.
三个表
SALES_DATA 分区, 有位图
SALES_DATA1 分区, 无位图
SALES_DATA2 无分区
一共跑3次 减少偶然性 取最小时间
先做 普通的插入
--用时 167.218,137.045,135.247 最小135.247 秒 insert into SALES_DATA1 select * from SALES_DATA3 where sales_date<to_date ('2009-02-1' ,'yyyy-mm-dd');
再用 nologging 试试
--用时 203.28,189.064,167.993 最小167.993 秒 alter table SALES_DATA1 nologging; insert into SALES_DATA1 select * from SALES_DATA3 where sales_date<to_date ('2009-02-1' ,'yyyy-mm-dd'); alter table SALES_DATA1 logging;时间竟然比 logging 还多. .. 理论上应该是短的. 反正至少看起来 nolog 不明显
再试试 append
--用时 81.867 , 89.569,84.574 最小 81.867 秒 insert /*+append*/ into SALES_DATA1 select * from SALES_DATA3 where sales_date<to_date ('2009-02-1' ,'yyyy-mm-dd');再试试别的 append + nologging
--用时 68.559,84.127,84.907 最小68.559 秒 insert /*+append*/ into SALES_DATA1 nologging select * from SALES_DATA3 where sales_date<to_date ('2009-02-1' ,'yyyy-mm-dd') ;似乎 append + nologging 中 nologging 才有点作用.
电脑垃圾 并行就不测了 粘下语句
alter table SALES_DATA3 parallel; alter table SALES_DATA1 parallel; alter table SALES_DATA1 nologging; insert /*+append*/ into SALES_DATA1 select /*+ parallel(t,2) */ * from SALES_DATA3 t where sales_date<to_date ('2009-02-1' ,'yyyy-mm-dd') ;
同样位图 对于insert 影响很大 时间可以相差几倍
alter index index_sales_data_partition modify partition sales_200903 unusable; alter index INDEX_SALES_DATA_CITY modify partition sales_200903 unusable; alter index INDEX_SALES_DATA_SALES_TYPE modify partition sales_200903 unusable; -----insert 语句 -----重建也用并行 alter index index_sales_data_partition rebuild partition sales_200903 NOLOGGING PARALLEL; alter index INDEX_SALES_DATA_CITY rebuild partition sales_200903 NOLOGGING PARALLEL; alter index INDEX_SALES_DATA_SALES_TYPE rebuild partition sales_200903 NOLOGGING PARALLEL;
相关推荐
Oracle 索引与分区索引介绍 Oracle 索引与分区索引是 Oracle 数据库中两个重要的概念,它们都是为了提高查询性能和数据存储效率而设计的。在本文中,我们将详细介绍 Oracle 索引与分区索引的概念、特点、分类、创建...
Oracle 分区表分区索引详解 Oracle 分区表分区索引是 Oracle 数据库中的一种重要机制,它可以提高数据的存储和查询效率。下面将详细介绍 Oracle 分区表分区索引的类型、分类、创建方法和维护方式。 一、分区表和...
#### 一、Oracle分区索引概念及分类 在Oracle数据库中,分区索引是针对分区表的一种特殊索引类型,它可以显著提高对于大规模数据集的查询性能。根据索引是否与表的分区策略相匹配,分区索引可以分为两大类:本地...
### Oracle 分区表与分区索引详解 #### 一、Oracle分区概述 在Oracle数据库中,分区技术是一种非常有效的管理大型表和索引的方法。通过将一个大的表或索引分成多个较小的部分(分区),可以显著提高查询性能,并...
Oracle 分区表及分区索引 Oracle 分区表是指将一个大表分割成多个小表,每个小表称为一个分区,分区表的优点是可以提高查询性能、改善管理型、增强容错性等。 分区表的分类: 1. 范围分区(Range Partitioning) ...
针对分区表,Oracle 提供了分区索引,它允许索引与分区策略相结合。例如,可以创建局部索引,每个分区都有自己的索引,或者创建全局索引,覆盖所有分区。局部索引通常在查询性能上有优势,而全局索引则适用于跨分区...
虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。
以下是对Oracle分区表和分区索引的深入解析: 1. **何时使用分区**: - 当表的数据量超过2GB时,分区有助于避免32位操作系统下的文件大小限制,同时减少大规模数据的备份时间。 - 对于包含历史数据的表,如按月份...
1. 分区表和分区索引是数据库管理中的关键技术之一。 2. 分区表可以将大表拆分成多个独立的物理分区,以提高数据I/O性能。 3. Oracle 分区表有多种类型,包括范围分区、散列分区、列表分区、组合分区、Interval分区...
局部索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区数,一句话,局部索引的分区机制和表的分区机制一样。2.如果局部索引的索引列以分区键开头,则称为前缀局部索引。3.如果局部索引的列不是以...
### Oracle 分区与索引详解 #### 一、Oracle 分区概述 在Oracle数据库中,分区是一种物理数据组织技术,它将一个大的表或索引分成多个较小的部分,每个部分都可以独立管理。通过分区,可以显著提高查询性能,简化...
Oracle分区索引是一种优化大型数据库查询性能的有效方法。它将大的单个索引分解为较小、更易管理的分区,每个分区对应表中的一个数据段。这样,查询只需要扫描与查询条件相关的分区,而非整个索引,从而提高查询速度...
文中提到的测试脚本用于演示如何建立分区表和分区索引,以供读者在实际环境中进行测试,加深理解。 ### 结论性建议 局部索引和全局索引的选择应根据应用场景的需求和维护策略来确定。局部索引通常用于数据仓库,而...
总结来说,Oracle分区是一种强大的数据库管理工具,特别适合处理大数据量和历史数据存储的情况。通过合理选择分区策略,可以极大地提升数据处理的速度和系统的整体性能。然而,设计和实施分区策略需要深思熟虑,以...
### 分区表及分区索引概述 在Oracle数据库中,分区技术是一种重要的数据管理手段,尤其适用于处理大型数据集。通过将大型表或索引分解为较小、更易于...希望本文提供的信息能帮助读者更好地理解和运用Oracle分区功能。
1. **什么是Oracle分区?** Oracle分区是将单个表或索引逻辑上划分为多个部分,每个部分称为一个分区。每个分区有自己的存储位置,可以在不同的表空间中,这样可以根据需要独立管理和操作。分区有助于减少I/O操作,...
总的来说,Oracle分区索引是大数据环境下提升数据库性能的关键技术。理解其工作原理和应用场景,能够帮助数据库管理员有效地设计和管理数据库,优化查询效率,同时保证系统的稳定性和可扩展性。