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;
posted @ 2019-12-27 19:48  StarHai  阅读(2268)  评论(0编辑  收藏  举报