一、实验内容
1.以常用“名字大全”与“百家姓”数据集为基础,生成不小于1千万条stud记录,要求,姓名的重复率不超过10%,学号以ABCD16EFGH为格式模板,即其中16是固定的,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.建立基于name的索引index_name,测试建立的时间与建立索引前后查询某一姓名及某一姓的时间长度。
4.测试索引index_name建立前后,分姓(简单地理解为姓名的第1,2位)的记录数统计时间。
5.按学号首位建立10个分区分别为part_0到part_9,测试建立分区前后分首位统计人数与分专业(EF位)统计人数的时间差别。
二、实验分析
1.实验思路
分别完成姓名表,学号表,学生其他信息表的建立和数据生成,最后将三张表数据同时插入学生信息表。
2.实验过程
0)写一个记录系统时间的过程,方便记录时间差
1)导入基本的姓名表
2)创建姓名各个字的视图
3)将视图进行笛卡尔积插入学生姓名表
4)成学生学号表
5)建立相关随机函数:性别,电话,邮箱,出生日期
6)生成学生其他信息表数据
7)将三张表数据同时插入学生信息表
8)记录各个操作的时间
3.生成姓名表分析
对原始的姓名创建3个视图,分别选出第一、二、三个字,其分别有572、1504和1200条记录,对于生成千万条数据,随机选出500、1200和20条记录就可达到实验要求。
4.生成学生学号分析
-- ABCD16EFGH:每次生成两位,分四批生成,可以在1分钟左右完成生成
--建立过程中要使用的表
drop table t_student_sno_gh_j432;
drop table t_student_sno_ef_j432;
drop table t_student_sno_cd_j432;
drop table t_student_sno_ab_j432;
create table t_student_sno_gh_j432(sno number(10));
create table t_student_sno_ef_j432(sno number(10));
create table t_student_sno_cd_j432(sno number(10));
create table t_student_sno_ab_j432(sno varchar2(10));
--通过批处理,建立过程分批生成:
declare
i int;
begin
for i in 1..32 loop--先生成班级内学生序号
insert into t_student_sno_gh_j432 values(i);
end loop;
for i in 1..50 loop--生成班级序号
insert /*+ append */ into t_student_sno_ef_j432 select 160000+i*100+t_student_sno_gh_j432.sno from t_student_sno_gh_j432;
commit;
end loop;
for i in 1..90 loop--生成专业序号
insert /*+ append */ into t_student_sno_cd_j432 select i*1000000+t_student_sno_ef_j432.sno from t_student_sno_ef_j432;
commit;
end loop;
for i in 1..80 loop--生成学院序号
insert /*+ append */ into t_student_sno_ab_j432 select substr(10000000000+i*100000000+t_student_sno_cd_j432.sno,2,10) from t_student_sno_cd_j432;
commit;
end loop;
end;
/
5.生成学生其他信息表分析
1)建立随机生成性别函数f_getSex_j432,在性别表中插入143条记录,其中男女占142条,还有一条为“其他”,每次调用函数会随机返回一条记录,可是男女占比为99.3%,达到实验要求。
2)另外建立随机产生电话函数f_getTel_j432、随机产生邮箱函数f_getEmail_j432、随机产生生日函数f_getBirthday_j432
3)通过批处理产生大量数据
--建立基本信息模板表
create table t_sequence_id(
id number(10),
sex varchar2(32),
tel varchar2(3