Oracle實驗三、基於大數據集的數據庫操作


 

一、目的與要求

本實驗主要是熟悉ORACLE的基於大數據集(記錄達到千萬級)的相關數據庫操作包括生成海量測試數據的更新操作、基於海量數據的索引維護、表空間、分區、視圖、序列及相關的統計分析。

二、操作環境

同實驗一

三、實驗內容

1.以常用“名字大全”與“百家姓”數據集為基礎,生成不小於1千萬條stud記錄,要求,姓名的重復率不超過10%,學號以ABCD17EFGH為格式模板,即其中17是固定的,AB為從01到80,CD為從01到90,EF為01到50,GH為01到32;性別中,男、女占比為99%到99.5%。TEL與E-mail不作要求,但不能全空。Birthday要求從‘19940101’到‘19990731’分布。要求記錄ORACLE數據文件的大小變化。(需要編制過程)

2.分別測試stud有主鍵與沒有主鍵情形下生成記錄的時間。

3.建立基於sname的索引index_name,測試建立的時間與建立索引前后查詢某一姓名及某一姓的時間長度。

4.測試索引index_name建立前后,分姓(簡單地理解為姓名的第1,2位)的記錄數統計時間。

5.按學號首位建立10個分區分別為part_0到part_9,測試建立分區前后分首位統計人數與分專業(EF位)統計人數的時間差別。

 

 

四實驗過程

 

0)寫一個記錄系統時間的過程,方便記錄時間差

 

drop user u_j524 cascade; 

create user u_j524 identified by p123456;
grant resource,connect,dba to u_j524;
conn u_j524/p123456


--建立精確記錄時間過程,方便記錄系統時間
drop table t_record_time_j524;
create table t_record_time_j524(things varchar2(128),time varchar2(32));

create or replace procedure p_record_time_j524(input varchar2) as
temp varchar2(32);
begin 
select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss.ff') into temp from dual;
insert into t_record_time_j524(things) values(input);
update t_record_time_j524 set time=temp where things=input;
end;
/
show error

exec p_record_time_j524('第一次執行記錄時間過程')
col things format a64;
col time format a32;
select * from t_record_time_j524;
 

1)導入基本的姓名表

--1.創建基本姓名表
drop table sname;
create table sname(sname varchar(32));

--2.插入基本姓名
exec p_record_time_j524('開始導入原始姓名')

@D:\name_insert.txt
commit;
exec p_record_time_j524('導入原始姓名結束')

2)創建姓名各個字的視圖

--3.制造足夠多的姓名
--  為名字的每個字創建視圖
drop view v_name1_j524;
drop view v_name2_j524;
drop view v_name3_j524;
drop view v_name12_j524;
drop view v_name123_j524;
create view v_name1_j524 as select * from (select distinct substr(sname,1,1) na1 from sname order by dbms_random.value) where rownum<=500;
create view v_name2_j524 as select * from (select distinct substr(sname,2,1) na2 from sname order by dbms_random.value) where rownum<=1200;
create view v_name3_j524 as select * from (select distinct substr(sname,3,1) na3 from sname order by dbms_random.value) where rownum<=20;

/*
500 1200 20
600000+12000000=12600000

select count(*) from v_name1_j524;
select count(*) from v_name2_j524;
select count(*) from v_name3_j524;
select * from v_name1_j524;
select * from v_name2_j524;
select *from v_name3_j524;
*/
create view v_name12_j524 as select concat(na1,na2) na12 from v_name1_j524,v_name2_j524;
create view v_name123_j524 as select concat(na12,na3) na123 from v_name12_j524,v_name3_j524;
 

3)將視圖進行笛卡爾積插入學生姓名表

--4創建t_stu_name_j524學生姓名表
drop table t_stu_name_j524;
create table t_stu_name_j524(sname varchar(16));
 
--5為姓名表t_stu_name_j524插入12600000條學生姓名
insert into t_stu_name_j524(sname) select na12 from v_name12_j524;
insert into t_stu_name_j524(sname) select na123 from v_name123_j524;
exec p_record_time_j524('完成為姓名表生成12600000條記錄')
select count(*) from t_stu_name_j524;
 

4)成學生學號表

--6.生成規范學號表
--  ABCD17EFGH:每次生成兩位,分四批生成,可以在1分鍾左右生成
--建立過程中要使用的表
drop table t_student_sno_gh_j524;
drop table t_student_sno_ef_j524;
drop table t_student_sno_cd_j524;
drop table t_student_sno_ab_j524;
create table t_student_sno_gh_j524(sno number(10));
create table t_student_sno_ef_j524(sno number(10));
create table t_student_sno_cd_j524(sno number(10));
create table t_student_sno_ab_j524(sno varchar2(10));
 
--建立過程:
declare
i int;
begin
for i in 1..32 loop
    insert into t_student_sno_gh_j524 values(i);
end loop;
for i in 1..50 loop
    insert /*+ append */ into t_student_sno_ef_j524 select 170000+i*100+t_student_sno_gh_j524.sno from t_student_sno_gh_j524;
    commit;
end loop;
for i in 1..90 loop
    insert /*+ append */ into t_student_sno_cd_j524 select i*1000000+t_student_sno_ef_j524.sno from t_student_sno_ef_j524;
    commit;
end loop;
for i in 1..80 loop
    insert /*+ append */ into t_student_sno_ab_j524 select substr(10000000000+i*100000000+t_student_sno_cd_j524.sno,2,10) from t_student_sno_cd_j524;
    commit;
end loop;
end;
/
show error

exec p_record_time_j524('完成11520000條學號ID生成')
 

5)建立相關隨機函數:性別,電話,郵箱,出生日期

 

--7.1批量處理sex, tel, email, birthday等數據
--   產生隨機性別:男、女占比為99%到99.5%
--   在性別表t_sex_j524中,143人,男女分別71人,一人性別為其它。隨機查詢一條記錄時,可使男、女占比為99.3%
--   函數f_getSex_j524返回值為隨機性別

create or replace function f_getSex_j524 return varchar2
is
f_numb number;
f_sex varchar2(8);
begin
    select dbms_random.value(1,143) into f_numb from dual;
    if f_numb<=71 then
        f_sex:='';
    elsif f_numb<=142 then
        f_sex:='';
    else
        f_sex:='其他';
    end if;
return f_sex;
end;
/
show error

--7.2產生隨機電話
--   函數f_getTel_j524會返回一個隨機手機號
create table t_tel_j524(tel varchar2(4));
insert into t_tel_j524 values('132');
insert into t_tel_j524 values('135');
insert into t_tel_j524 values('156');
insert into t_tel_j524 values('151');
insert into t_tel_j524 values('138');
insert into t_tel_j524 values('139');
insert into t_tel_j524 values('183');
insert into t_tel_j524 values('187');
insert into t_tel_j524 values('153');
insert into t_tel_j524 values('150');
insert into t_tel_j524 values('186');
insert into t_tel_j524 values('188');

create or replace function f_getTel_j524 return varchar2
is
getTel varchar2(12);
numb_head varchar2(4);
numb_other varchar2(16);
begin
select tel into numb_head from (select tel from t_tel_j524 order by dbms_random.value) where rownum=1;
select substr(cast(dbms_random.value as varchar2(32)),3,8) into numb_other from dual;
getTel:=numb_head||numb_other;
return getTel;
end;
/
show error
 
--7.3隨機產生郵箱
--   函數f_getEmail_j524會返回一個隨機郵箱號
create table t_email_j524 (email varchar2(16));
insert into t_email_j524 values('126');
insert into t_email_j524 values('139');
insert into t_email_j524 values('sohu');
insert into t_email_j524 values('sina');
insert into t_email_j524 values('163');
insert into t_email_j524 values('foxmail');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
 
create or replace function f_getemail_j524 return varchar2
is
getEmail varchar2(32);
em_name varchar2(16);
em_own varchar2(16);
begin
select substr(cast(dbms_random.value as varchar2(32)),3,11) into em_name from dual;
select email into em_own from (select email from t_email_j524 order by dbms_random.value) where rownum=1;
getEmail:=em_name||'@'||em_own||'.com';
return getEmail;
end;
/
show error
 
--7.4產生隨機生日
--   函數f_getBirthday_j524會返回一個在[19940101,19990701]時間內的日期
create or replace function f_getBirthday_j524 return date
is
birthday date;
begin
select to_date(trunc(dbms_random.value(2449354,2451186)),'J') into birthday from dual;
return birthday;
end;
/
show error
exec p_record_time_j524('性別、手機號、郵箱、出生日期等隨機函數生成完畢')
 

6)生成學生其他信息表數據

7)將三張表數據同時插入學生信息表

8)記錄各個操作的時間

--7.5生成完整學生表除學號和姓名之外的所有信息
--建立基本信息模板表
create table t_sequence_id(
id number(10),
sex varchar2(32),
tel varchar2(32),
email varchar2(32),
birthday date);
 
--存儲大量的學生其他信息,千萬級以上
drop table t_stud_other_information_j524;
create table t_stud_other_information_j524(
    id number(16),
    sex varchar2(32),
    tel varchar2(32),
    email varchar2(32),
    birthday date);
 
--生成1萬條數據模板
begin
delete from t_sequence_id;
for i in 0..9999 loop
insert into t_sequence_id(id, sex, tel, email, birthday) values(i,f_getsex_j524,f_gettel_j524,f_getemail_j524,f_getbirthday_j524);
end loop;
end;
/
show error
//select * from t_sequence_id;
 
--每1萬條數據插入一次,得到12000000數據
begin
delete from t_stud_other_information_j524;
for i in 1..1200 loop
insert /*+ append */ into t_stud_other_information_j524(id, sex, tel, email,birthday) select i * 10000 +t_sequence_id.id as MSISDN,t_sequence_id.sex,t_sequence_id.tel,t_sequence_id.email,t_sequence_id.birthday from t_sequence_id;
commit;
end loop;
end;
/
exec p_record_time_j524('完成生成12000000條其他信息生成')
--顯示生成數量 
select count(*) from t_stud_other_information_j524;

///////////////////////////////////////////////// 
exec p_record_time_j524('學生信息表沒有主鍵,生成11520000條記錄,開始時間')
drop table t_student_j524;
create table t_student_j524(
    sno varchar2(10),
    sname varchar2(32),
    sex varchar2(32),
    tel varchar2(32),
    email varchar2(32),
    birthday date);
//////////////////////////////////////// 
--生成完整的學生信息表:將學號,姓名和其他信息,放在一起
insert into t_student_j524(sno,sname, sex, tel, email, birthday) select X.sno,A.sname, B.sex, B.tel, B.email, B.birthday from (select rownum rownum_X,sno from t_student_sno_ab_j524) X, (select rownum rownum_A,sname from t_stu_name_j524) A, (select rownum rownum_B,sex,tel,email,birthday from t_stud_other_information_j524) B where rownum_A = rownum_B and rownum_A = rownum_X;
exec p_record_time_j524('學生信息表沒有主鍵,生成11520000條記錄,完成時間')
 
exec p_record_time_j524('學生信息表有主鍵,生成11520000條記錄,開始時間')
drop table t_student_j524;
create table t_student_j524(
    sno varchar2(10) primary key,
    sname varchar2(32),
    sex varchar2(32),
    tel varchar2(32),
    email varchar2(32),
    birthday date);
insert into t_student_j524(sno,sname, sex, tel, email, birthday) select X.sno,A.sname, B.sex, B.tel, B.email, B.birthday from (select rownum rownum_X,sno from t_student_sno_ab_j524) X, (select rownum rownum_A,sname from t_stu_name_j524) A, (select rownum rownum_B,sex,tel,email,birthday from t_stud_other_information_j524) B where rownum_A = rownum_B and rownum_A = rownum_X;
exec p_record_time_j524('學生信息表有主鍵,生成11520000條記錄,完成時間')
 
--為學生表添加其他約束
alter table t_student_j524 add constraint ck_student_sex check(sex in('','','其他'));
alter table t_student_j524 add constraint ck_student_email check(email like '%@%.%');
alter table t_student_j524 add constraint ck_student_birthday check(birthday>=to_date('19940101','yyyymmdd') and birthday<=to_date('19990731','yyyymmdd'));

--隨機查詢100名同學信息
set linesize 300;
set pagesize 1000;
col sno format a11;
col sname format a8;
col sex format a6;
col email format a26;
col tel format a12;

alter session set nls_date_format = 'yyyy-mm-dd';
select * from (select * from t_student_j524 order by dbms_random.value()) where rownum<=100;
//select count(*) from t_student_j524;
 
col things format a64;
col time format a32;
select * from t_record_time_j524;

exec p_record_time_j524('沒有姓名索引,查詢一條姓名的開始時間')
select * from t_student_j524 where sname='基雲今';
exec p_record_time_j524('沒有姓名索引,查詢一條姓名的結束時間')
 
exec p_record_time_j524('沒有姓名索引,查詢某一姓氏人數的開始時間')
select * from t_student_j524 where sname like '基%';
exec p_record_time_j524('沒有姓名索引,查詢某一姓氏人數的結束時間')
 
exec p_record_time_j524('沒有姓名索引,統計某一姓氏人數的開始時間')
select count(*) from t_student_j524 where sname like '基%';
exec p_record_time_j524('沒有姓名索引,統計某一姓氏人數的結束時間')
 
exec p_record_time_j524('沒有姓名索引,統計某一姓名第二個字相同人數的開始時間')
select count(*) from t_student_j524 where sname like '_雲%';
exec p_record_time_j524('沒有姓名索引,統計某一姓名第二個字相同人數的結束時間')

--創建索引
drop index i_stu_sname_j524;
exec p_record_time_j524('開始創建姓名索引')
create index i_stu_sname_j524 on t_student_j524(sname);
exec p_record_time_j524('完成創建姓名索引')
 
exec p_record_time_j524('有姓名索引,查詢一條姓名,開始時間')
select * from t_student_j524 where sname='基雲今';
exec p_record_time_j524('有姓名索引,查詢一條姓名,結束時間')
 
exec p_record_time_j524('有姓名索引,查詢某一姓氏人數的開始時間')
select * from t_student_j524 where sname like '基%';
exec p_record_time_j524('有姓名索引,查詢某一姓氏人數的結束時間')
 
exec p_record_time_j524('有姓名索引,統計某一姓氏人數的開始時間')
select count(*) from t_student_j524 where sname like '基%';
exec p_record_time_j524('有姓名索引,統計某一姓氏人數的結束時間')
 
exec p_record_time_j524('有姓名索引,統計某一姓名第二個字相同人數的開始時間')
select count(*) from t_student_j524 where sname like '_雲%';
exec p_record_time_j524('有姓名索引,統計某一姓名第二個字相同人數的結束時間')

exec p_record_time_j524('沒有分區,按學號首位ID統計人數的開始時間')
select count(*) from t_student_j524 where sno like '5%';
exec p_record_time_j524('沒有分區,按學號首位ID統計人數的結束時間')
 
exec p_record_time_j524('沒有分區,按專業統計人數的開始時間')
select count(*) from t_student_j524 where sno like '______01%';
exec p_record_time_j524('沒有分區,按專業統計人數的結束時間')
 
--重新建立學生表,並分區
drop table t_student_j524;
create table t_student_j524(
    sno varchar2(10) primary key,--學生學號
    sname varchar2(32),
    sex varchar2(32),
    tel varchar2(32),
    email varchar2(32),
    birthday date)partition by range(sno)(
partition part_0 values less than ('1000170000'),
partition part_1 values less than ('2000170000'),
partition part_2 values less than ('3000170000'),
partition part_3 values less than ('4000170000'),
partition part_4 values less than ('5000170000'),
partition part_5 values less than ('6000170000'),
partition part_6 values less than ('7000170000'),
partition part_7 values less than ('8000170000'),
partition part_8 values less than ('9000170000'),
partition part_9 values less than (maxvalue));
insert into t_student_j524(sno,sname, sex, tel, email, birthday) select X.sno,A.sname, B.sex, B.tel, B.email, B.birthday from (select rownum rownum_X,sno from t_student_sno_ab_j524) X, (select rownum rownum_A,sname from t_stu_name_j524) A, (select rownum rownum_B,sex,tel,email,birthday from t_stud_other_information_j524) B where rownum_A = rownum_B and rownum_A = rownum_X;


--為學生表添加其他約束
alter table t_student_j524 add constraint ck_student_sex check(sex in('','','其他'));
alter table t_student_j524 add constraint ck_student_email check(email like '%@%.%');
alter table t_student_j524 add constraint ck_student_birthday check(birthday>=to_date('19940101','yyyymmdd') and birthday<=to_date('19990731','yyyymmdd'));
 
exec p_record_time_j524('有分區,按學號首位ID統計人數的開始時間')
select count(*) from t_student_j524 where sno like '5%';
exec p_record_time_j524('有分區,按學號首位ID統計人數的結束時間')
 
exec p_record_time_j524('有分區,按專業統計人數的開始時間')
select count(*) from t_student_j524 where sno like '______01%';
exec p_record_time_j524('有分區,按專業統計人數的結束時間')
 
col things format a64;
col time format a32;
select * from t_record_time_j524 order by time;

spool off;

 

五、總代碼

drop user u_j524 cascade; 

create user u_j524 identified by p123456;
grant resource,connect,dba to u_j524;
conn u_j524/p123456


--建立精確記錄時間過程,方便記錄系統時間
drop table t_record_time_j524;
create table t_record_time_j524(things varchar2(128),time varchar2(32));

create or replace procedure p_record_time_j524(input varchar2) as
temp varchar2(32);
begin 
select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss.ff') into temp from dual;
insert into t_record_time_j524(things) values(input);
update t_record_time_j524 set time=temp where things=input;
end;
/
show error

exec p_record_time_j524('第一次執行記錄時間過程')
col things format a64;
col time format a32;
select * from t_record_time_j524;
 
--1.創建基本姓名表
drop table sname;
create table sname(sname varchar(32));

--2.插入基本姓名
exec p_record_time_j524('開始導入原始姓名')

@D:\name_insert.txt
commit;
exec p_record_time_j524('導入原始姓名結束')

--3.制造足夠多的姓名
--  為名字的每個字創建視圖
drop view v_name1_j524;
drop view v_name2_j524;
drop view v_name3_j524;
drop view v_name12_j524;
drop view v_name123_j524;
create view v_name1_j524 as select * from (select distinct substr(sname,1,1) na1 from sname order by dbms_random.value) where rownum<=500;
create view v_name2_j524 as select * from (select distinct substr(sname,2,1) na2 from sname order by dbms_random.value) where rownum<=1200;
create view v_name3_j524 as select * from (select distinct substr(sname,3,1) na3 from sname order by dbms_random.value) where rownum<=20;

/*
500 1200 20
600000+12000000=12600000

select count(*) from v_name1_j524;
select count(*) from v_name2_j524;
select count(*) from v_name3_j524;
select * from v_name1_j524;
select * from v_name2_j524;
select *from v_name3_j524;
*/
create view v_name12_j524 as select concat(na1,na2) na12 from v_name1_j524,v_name2_j524;
create view v_name123_j524 as select concat(na12,na3) na123 from v_name12_j524,v_name3_j524;
 
--4創建t_stu_name_j524學生姓名表
drop table t_stu_name_j524;
create table t_stu_name_j524(sname varchar(16));
 
--5為姓名表t_stu_name_j524插入12600000條學生姓名
insert into t_stu_name_j524(sname) select na12 from v_name12_j524;
insert into t_stu_name_j524(sname) select na123 from v_name123_j524;
exec p_record_time_j524('完成為姓名表生成12600000條記錄')
select count(*) from t_stu_name_j524;
 
--6.生成規范學號表
--  ABCD17EFGH:每次生成兩位,分四批生成,可以在1分鍾左右生成
--建立過程中要使用的表
drop table t_student_sno_gh_j524;
drop table t_student_sno_ef_j524;
drop table t_student_sno_cd_j524;
drop table t_student_sno_ab_j524;
create table t_student_sno_gh_j524(sno number(10));
create table t_student_sno_ef_j524(sno number(10));
create table t_student_sno_cd_j524(sno number(10));
create table t_student_sno_ab_j524(sno varchar2(10));
 
--建立過程:
declare
i int;
begin
for i in 1..32 loop
    insert into t_student_sno_gh_j524 values(i);
end loop;
for i in 1..50 loop
    insert /*+ append */ into t_student_sno_ef_j524 select 170000+i*100+t_student_sno_gh_j524.sno from t_student_sno_gh_j524;
    commit;
end loop;
for i in 1..90 loop
    insert /*+ append */ into t_student_sno_cd_j524 select i*1000000+t_student_sno_ef_j524.sno from t_student_sno_ef_j524;
    commit;
end loop;
for i in 1..80 loop
    insert /*+ append */ into t_student_sno_ab_j524 select substr(10000000000+i*100000000+t_student_sno_cd_j524.sno,2,10) from t_student_sno_cd_j524;
    commit;
end loop;
end;
/
show error

exec p_record_time_j524('完成11520000條學號ID生成')
 
--7.1批量處理sex, tel, email, birthday等數據
--   產生隨機性別:男、女占比為99%到99.5%
--   在性別表t_sex_j524中,143人,男女分別71人,一人性別為其它。隨機查詢一條記錄時,可使男、女占比為99.3%
--   函數f_getSex_j524返回值為隨機性別

create or replace function f_getSex_j524 return varchar2
is
f_numb number;
f_sex varchar2(8);
begin
    select dbms_random.value(1,143) into f_numb from dual;
    if f_numb<=71 then
        f_sex:='';
    elsif f_numb<=142 then
        f_sex:='';
    else
        f_sex:='其他';
    end if;
return f_sex;
end;
/
show error

--7.2產生隨機電話
--   函數f_getTel_j524會返回一個隨機手機號
create table t_tel_j524(tel varchar2(4));
insert into t_tel_j524 values('132');
insert into t_tel_j524 values('135');
insert into t_tel_j524 values('156');
insert into t_tel_j524 values('151');
insert into t_tel_j524 values('138');
insert into t_tel_j524 values('139');
insert into t_tel_j524 values('183');
insert into t_tel_j524 values('187');
insert into t_tel_j524 values('153');
insert into t_tel_j524 values('150');
insert into t_tel_j524 values('186');
insert into t_tel_j524 values('188');

create or replace function f_getTel_j524 return varchar2
is
getTel varchar2(12);
numb_head varchar2(4);
numb_other varchar2(16);
begin
select tel into numb_head from (select tel from t_tel_j524 order by dbms_random.value) where rownum=1;
select substr(cast(dbms_random.value as varchar2(32)),3,8) into numb_other from dual;
getTel:=numb_head||numb_other;
return getTel;
end;
/
show error
 
--7.3隨機產生郵箱
--   函數f_getEmail_j524會返回一個隨機郵箱號
create table t_email_j524 (email varchar2(16));
insert into t_email_j524 values('126');
insert into t_email_j524 values('139');
insert into t_email_j524 values('sohu');
insert into t_email_j524 values('sina');
insert into t_email_j524 values('163');
insert into t_email_j524 values('foxmail');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
insert into t_email_j524 values('qq');
 
create or replace function f_getemail_j524 return varchar2
is
getEmail varchar2(32);
em_name varchar2(16);
em_own varchar2(16);
begin
select substr(cast(dbms_random.value as varchar2(32)),3,11) into em_name from dual;
select email into em_own from (select email from t_email_j524 order by dbms_random.value) where rownum=1;
getEmail:=em_name||'@'||em_own||'.com';
return getEmail;
end;
/
show error
 
--7.4產生隨機生日
--   函數f_getBirthday_j524會返回一個在[19940101,19990701]時間內的日期
create or replace function f_getBirthday_j524 return date
is
birthday date;
begin
select to_date(trunc(dbms_random.value(2449354,2451186)),'J') into birthday from dual;
return birthday;
end;
/
show error
exec p_record_time_j524('性別、手機號、郵箱、出生日期等隨機函數生成完畢')
 
--7.5生成完整學生表除學號和姓名之外的所有信息
--建立基本信息模板表
create table t_sequence_id(
id number(10),
sex varchar2(32),
tel varchar2(32),
email varchar2(32),
birthday date);
 
--存儲大量的學生其他信息,千萬級以上
drop table t_stud_other_information_j524;
create table t_stud_other_information_j524(
    id number(16),
    sex varchar2(32),
    tel varchar2(32),
    email varchar2(32),
    birthday date);
 
--生成1萬條數據模板
begin
delete from t_sequence_id;
for i in 0..9999 loop
insert into t_sequence_id(id, sex, tel, email, birthday) values(i,f_getsex_j524,f_gettel_j524,f_getemail_j524,f_getbirthday_j524);
end loop;
end;
/
show error
//select * from t_sequence_id;
 
--每1萬條數據插入一次,得到12000000數據
begin
delete from t_stud_other_information_j524;
for i in 1..1200 loop
insert /*+ append */ into t_stud_other_information_j524(id, sex, tel, email,birthday) select i * 10000 +t_sequence_id.id as MSISDN,t_sequence_id.sex,t_sequence_id.tel,t_sequence_id.email,t_sequence_id.birthday from t_sequence_id;
commit;
end loop;
end;
/
exec p_record_time_j524('完成生成12000000條其他信息生成')
--顯示生成數量 
select count(*) from t_stud_other_information_j524;

///////////////////////////////////////////////// 
exec p_record_time_j524('學生信息表沒有主鍵,生成11520000條記錄,開始時間')
drop table t_student_j524;
create table t_student_j524(
    sno varchar2(10),
    sname varchar2(32),
    sex varchar2(32),
    tel varchar2(32),
    email varchar2(32),
    birthday date);
//////////////////////////////////////// 
--生成完整的學生信息表:將學號,姓名和其他信息,放在一起
insert into t_student_j524(sno,sname, sex, tel, email, birthday) select X.sno,A.sname, B.sex, B.tel, B.email, B.birthday from (select rownum rownum_X,sno from t_student_sno_ab_j524) X, (select rownum rownum_A,sname from t_stu_name_j524) A, (select rownum rownum_B,sex,tel,email,birthday from t_stud_other_information_j524) B where rownum_A = rownum_B and rownum_A = rownum_X;
exec p_record_time_j524('學生信息表沒有主鍵,生成11520000條記錄,完成時間')
 
exec p_record_time_j524('學生信息表有主鍵,生成11520000條記錄,開始時間')
drop table t_student_j524;
create table t_student_j524(
    sno varchar2(10) primary key,
    sname varchar2(32),
    sex varchar2(32),
    tel varchar2(32),
    email varchar2(32),
    birthday date);
insert into t_student_j524(sno,sname, sex, tel, email, birthday) select X.sno,A.sname, B.sex, B.tel, B.email, B.birthday from (select rownum rownum_X,sno from t_student_sno_ab_j524) X, (select rownum rownum_A,sname from t_stu_name_j524) A, (select rownum rownum_B,sex,tel,email,birthday from t_stud_other_information_j524) B where rownum_A = rownum_B and rownum_A = rownum_X;
exec p_record_time_j524('學生信息表有主鍵,生成11520000條記錄,完成時間')
 
--為學生表添加其他約束
alter table t_student_j524 add constraint ck_student_sex check(sex in('','','其他'));
alter table t_student_j524 add constraint ck_student_email check(email like '%@%.%');
alter table t_student_j524 add constraint ck_student_birthday check(birthday>=to_date('19940101','yyyymmdd') and birthday<=to_date('19990731','yyyymmdd'));

--隨機查詢100名同學信息
set linesize 300;
set pagesize 1000;
col sno format a11;
col sname format a8;
col sex format a6;
col email format a26;
col tel format a12;

alter session set nls_date_format = 'yyyy-mm-dd';
select * from (select * from t_student_j524 order by dbms_random.value()) where rownum<=100;
//select count(*) from t_student_j524;
 
col things format a64;
col time format a32;
select * from t_record_time_j524;

exec p_record_time_j524('沒有姓名索引,查詢一條姓名的開始時間')
select * from t_student_j524 where sname='基雲今';
exec p_record_time_j524('沒有姓名索引,查詢一條姓名的結束時間')
 
exec p_record_time_j524('沒有姓名索引,查詢某一姓氏人數的開始時間')
select * from t_student_j524 where sname like '基%';
exec p_record_time_j524('沒有姓名索引,查詢某一姓氏人數的結束時間')
 
exec p_record_time_j524('沒有姓名索引,統計某一姓氏人數的開始時間')
select count(*) from t_student_j524 where sname like '基%';
exec p_record_time_j524('沒有姓名索引,統計某一姓氏人數的結束時間')
 
exec p_record_time_j524('沒有姓名索引,統計某一姓名第二個字相同人數的開始時間')
select count(*) from t_student_j524 where sname like '_雲%';
exec p_record_time_j524('沒有姓名索引,統計某一姓名第二個字相同人數的結束時間')

--創建索引
drop index i_stu_sname_j524;
exec p_record_time_j524('開始創建姓名索引')
create index i_stu_sname_j524 on t_student_j524(sname);
exec p_record_time_j524('完成創建姓名索引')
 
exec p_record_time_j524('有姓名索引,查詢一條姓名,開始時間')
select * from t_student_j524 where sname='基雲今';
exec p_record_time_j524('有姓名索引,查詢一條姓名,結束時間')
 
exec p_record_time_j524('有姓名索引,查詢某一姓氏人數的開始時間')
select * from t_student_j524 where sname like '基%';
exec p_record_time_j524('有姓名索引,查詢某一姓氏人數的結束時間')
 
exec p_record_time_j524('有姓名索引,統計某一姓氏人數的開始時間')
select count(*) from t_student_j524 where sname like '基%';
exec p_record_time_j524('有姓名索引,統計某一姓氏人數的結束時間')
 
exec p_record_time_j524('有姓名索引,統計某一姓名第二個字相同人數的開始時間')
select count(*) from t_student_j524 where sname like '_雲%';
exec p_record_time_j524('有姓名索引,統計某一姓名第二個字相同人數的結束時間')

exec p_record_time_j524('沒有分區,按學號首位ID統計人數的開始時間')
select count(*) from t_student_j524 where sno like '5%';
exec p_record_time_j524('沒有分區,按學號首位ID統計人數的結束時間')
 
exec p_record_time_j524('沒有分區,按專業統計人數的開始時間')
select count(*) from t_student_j524 where sno like '______01%';
exec p_record_time_j524('沒有分區,按專業統計人數的結束時間')
 
--重新建立學生表,並分區
drop table t_student_j524;
create table t_student_j524(
    sno varchar2(10) primary key,--學生學號
    sname varchar2(32),
    sex varchar2(32),
    tel varchar2(32),
    email varchar2(32),
    birthday date)partition by range(sno)(
partition part_0 values less than ('1000170000'),
partition part_1 values less than ('2000170000'),
partition part_2 values less than ('3000170000'),
partition part_3 values less than ('4000170000'),
partition part_4 values less than ('5000170000'),
partition part_5 values less than ('6000170000'),
partition part_6 values less than ('7000170000'),
partition part_7 values less than ('8000170000'),
partition part_8 values less than ('9000170000'),
partition part_9 values less than (maxvalue));
insert into t_student_j524(sno,sname, sex, tel, email, birthday) select X.sno,A.sname, B.sex, B.tel, B.email, B.birthday from (select rownum rownum_X,sno from t_student_sno_ab_j524) X, (select rownum rownum_A,sname from t_stu_name_j524) A, (select rownum rownum_B,sex,tel,email,birthday from t_stud_other_information_j524) B where rownum_A = rownum_B and rownum_A = rownum_X;


--為學生表添加其他約束
alter table t_student_j524 add constraint ck_student_sex check(sex in('','','其他'));
alter table t_student_j524 add constraint ck_student_email check(email like '%@%.%');
alter table t_student_j524 add constraint ck_student_birthday check(birthday>=to_date('19940101','yyyymmdd') and birthday<=to_date('19990731','yyyymmdd'));
 
exec p_record_time_j524('有分區,按學號首位ID統計人數的開始時間')
select count(*) from t_student_j524 where sno like '5%';
exec p_record_time_j524('有分區,按學號首位ID統計人數的結束時間')
 
exec p_record_time_j524('有分區,按專業統計人數的開始時間')
select count(*) from t_student_j524 where sno like '______01%';
exec p_record_time_j524('有分區,按專業統計人數的結束時間')
 
col things format a64;
col time format a32;
select * from t_record_time_j524 order by time;

spool off;




drop table t_record_time_j524;
drop table sname;

drop view v_name1_j524;
drop view v_name2_j524;
drop view v_name3_j524;
drop view v_name12_j524;
drop view v_name123_j524;

drop table t_stu_name_j524;

drop table t_student_sno_gh_j524;
drop table t_student_sno_ef_j524;
drop table t_student_sno_cd_j524;
drop table t_student_sno_ab_j524;

drop table t_tel_j524;
drop table t_email_j524;
drop table t_sequence_id;

drop table t_stud_other_information_j524;

drop index i_stu_sname_j524;
drop table t_student_j524;

conn system/123456
drop user u_j524 cascade;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM