一、目的與要求
本實驗主要是熟悉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位)統計人數的時間差別。
四實驗過程
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生成')
--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)將三張表數據同時插入學生信息表
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;