统计数据处理用数据库的设计思考
统计数据处理过程大致分为:数据录入、数据审核和修改、数据汇总三个主要步骤或阶段,一般还包括数据的导入和导出。我们在设计用于统计数据处理的数据库时需要考虑各个阶段的用户需求特点,并进行相应的设计。
数据录入阶段:
这一阶段的特点是大量数据的录入,每次插入的数据量不一定很大,但有大量的提交。
数据审核和修改:
这一阶段的特点是批量数据的处理,产生审核错误清单,并随错误量的大小有相应数量的修改操作。
数据汇总:
这一阶段的特点是批量数据的处理,产生汇总结果。
数据的导入和导出:
导入阶段的特点是大量数据的导入,每次插入的数据量很大,但只有少量的提交。
数据导出一般从数据库中向外部文件输出数据,也是批量数据的处理。
用表格的方式说明如下:
|
写 |
读 |
提交 |
录入 |
多 |
少 |
多 |
审核 |
少 |
多 |
少 |
汇总 |
少 |
多 |
少 |
导入 |
多 |
少 |
少 |
除了业务的特点,我们还应考虑使用的dbms的特点
Oracle数据库的存储方式决定了它读取和批量插入速度较快,批量更新和删除较慢。
所以我们在设计时要尽量发挥Oracle数据库的长处,规避Oracle数据库的短处。
除此以外,我们还有许多可以调整的地方。例如:
1.表设计用较多字段但较少的记录还是较少字段但较多的记录。
2. 索引的采用
3. 表的存储参数
几种Oracle数据汇总的方法比较
我们在编写利用数据库存储数据的应用程序时,怎样加工数据有多种选择,一般来说,不外乎下面几种:SQL,数据库提供的存储过程,高级语言取出数据库的数据计算。
这些方法的优缺点不一定为人所知,下面我们以Oracle数据库为例,通过实验的方法来了解。
测试数据的产生,为尽量模拟实际统计数据处理的数据分布特点,我们采用了2种表格进行测试,
第一种 基本情况表,较多的字符型指标,指标的值长度差距较大,从1个字符到几十个字符
第二种 数据表 除了关键字,较多的数值型指标,指标的值基本上都在一个范围内,如15位有效数字
我们对第一种 基本情况表采用了第一次经济普查601表的结构和部分数据
第二种数据表用存储过程自动产生结构和数据
-- createtab创建一个含有指定数值型列的表,每个字段的有效数字可以指定
create or replace procedure createtab(colc IN NUMBER,PP IN NUMBER:=15,SS IN NUMBER:=2)
is
buf varchar(24000):='create table tcol'||to_char(colc)||'(x1 varchar(10),';
begin
for i in 1..colc-1
loop
buf:=buf||'v'||to_char(i)||' number('||to_char(PP)||','||to_char(SS)||'),';
end loop;
buf:=buf||'v'||to_char(colc)||' number('||to_char(PP)||','||to_char(SS)||'))';
execute immediate buf;
end;
-- inserttab插入一个含有指定数值型列的表,插入的行数可以指定,数值是随机的
create or replace procedure inserttab(rowc NUMBER,colc NUMBER)
is
buf varchar(24000):='insert into tcol'||to_char(colc)||' select level,';
begin
for i in 1..colc-1
loop
buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10),';
end loop;
buf:=buf||'mod(level*DBMS_RANDOM.RANDOM,1e10) from dual connect by level<='||to_char(rowc);
execute immediate buf;
end;
-- bat_ins将含有多个数值型列的表数据插入一个只有1个数值型列的表
create or replace procedure bat_ins(colc NUMBER)
as
begin
for i in 1..colc loop
EXECUTE IMMEDIATE 'insert into tcol1 select x1,'||i||',v'||i||' from tcol'||colc;
end loop;
commit;
end;
首先对20列数据进行测试
SQL> drop table tcol1;
Table dropped.
SQL> drop table tcol10;
Table dropped.
SQL> purge recyclebin;
Recyclebin purged.
SQL> set timi on
SQL> exec createtab(20);
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.04
SQL> exec inserttab(20000,20);
PL/SQL procedure successfully completed.
Elapsed: 00:00:07.34
SQL> create table tcol1 as select x1,x1 x2,v1 from tcol20 where 1=2;
Table created.
Elapsed: 00:00:00.02
SQL> exec bat_ins(20);
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.99
SQL> select x2, sum(v1) s1 from tcol1 group by x2 order by x2+0;
X2 S1
---------- ----------
1 1.8166E+12
2 -4.798E+11
3 -6.239E+11
4 -4.928E+11
5 8.3407E+11
6 4.0789E+11
7 2.3538E+11
8 -6.511E+11
9 -7.053E+11
10 -7.679E+11
11 6.6244E+11
12 -7.117E+11
13 3.8880E+11
14 -2.891E+11
15 -8.720E+11
16 1.1746E+11
17 3.4030E+11
18 -9.744E+11
19 2.1850E+12
20 -1.412E+11
20 rows selected.
Elapsed: 00:00:00.82
SQL> set pages 9999
SQL> select 'select ' from dual union all select 'sum(v'||level||') s'||level || ',' from dual connect by level<20 union all select 'sum(v20) s20 from tcol20' from dual;
'SELECT'
--------------------------------------------------------------------------------
select
sum(v1) s1,
sum(v2) s2,
sum(v3) s3,
sum(v4) s4,
sum(v5) s5,
sum(v6) s6,
sum(v7) s7,
sum(v8) s8,
sum(v9) s9,
sum(v10) s10,
sum(v11) s11,
sum(v12) s12,