Oracle 파 티 션, 색인, 테스트 (1)
12150 단어 Oacle
준비 작업
--
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_DATA 3 는 1 천만 데이터 로 1 월 에서 5 월 사이 에 분포 한다.
시계 세 개
SALES_DATA 섹 션
SALES_DATA1 파 티 션
SALES_DATA2 파 티 션 없 음
총 세 번 뛰 어서 우연성 을 줄 이 고 최소 시간 을 갖 도록 하 겠 습 니 다.
그냥 삽입 을 먼저 하 겠 습 니 다.
-- 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;
로 깅 보다 시간 이 더 많다 니.. 이론 적 으로 짧 을 거 야.. 어쨌든 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;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 작업 은 Clob 또는 NClob 데이터 형식의 저장 프로 세 스 인 스 턴 스 를 포함 합 니 다.텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.