最近做的项目中涉及到大数据量的问题,具体问题是:监测数字电视的信号,对传输的码流进行指标监测,每秒监测到20000个流,每个流对应着20多个指标,每秒存储一次将这20000流存储起来,需要保存24小时的数据。
这个问题研究了好几天:
一、文件写入存储:但是如果将一天的17亿条记录都写入到一个文件里,没试过,相信会很慢,而且查询的时候会更慢。如果写入到多个文件,按照流ID可以将数据拆成20000个分类,同时对20000个文件执行写入操作也不现实。
二、数据库存储:文件存储的方式pass掉了之后开始考虑数据库存储
1、首先我用的Oracle进行性能测试:
将表按照流ID进列表分区,分为20000个区,然后每个分区内存储86400条数据(也就是该流从一天的第1秒到86400秒对应的指标数据),需要有索引,主键是全局索引,其余的列我又建了4个分区索引。
第一步创建6个表空间,保证每个表空间都能拓展到32GB大小(Oracle的表空间最大能拓展到32GB)
第二步要创建这个分区表:
-- Create table
create table AAA
(
ID number(8),
StreamID number(8),
StreamType number(1),
FAvailability number(5),
Bandwidth number(4),
ValidBandwidth number(4),
MDI_DF number(5),
MDI_MLR number(5),
Delay_Time number(5),
IPInterval number(5),
IPJitter number(5),
Time date,
MLT15 number(5),
MLT24 number(5),
MLS number(5),
SliceNum number(5),
CachedTime number(5),
StuckTime number(5),
GetSliceErr number(5),
RetransmitRate number(5),
RepeatRate number(5),
SecondsFlag number(5)
)
partition by list(SecondsFlag)
(
partition p1 values(1) tablespace tbs_haicheng
);
第三步再为t_stream表创建19999个分区:
DECLARE
parName varchar2(100);
sql_str varchar2(500);
BEGIN
FOR I IN 2..20000 LOOP
parName:='p'||I;
sql_str:='ALTER TABLE aaa ADD partition'||' p'||I|| ' VALUES('||I||')';
execute immediate sql_str;
END LOOP;
END;
第四步为t_stream创建4个分区索引:
-- Create/Recreate indexes
create index LOCAL_INDEX_REPEATRATE on AAA (REPEATRATE);
create index LOCAL_INDEX_SECONDSFLAG on AAA (SECONDSFLAG);
create index LOCAL_INDEX_STREAM on AAA (STREAMID);
create index LOCAL_INDEX_TIME on AAA (TIME);
第五步创建一个表结构与t_stream相似的表:
create table a
(
ID number(8),
StreamID number(8),
StreamType number(1),
FAvailability number(5),
Bandwidth number(4),
ValidBandwidth number(4),
MDI_DF number(5),
MDI_MLR number(5),
Delay_Time number(5),
IPInterval number(5),
IPJitter number(5),
Time date,
MLT15 number(5),
MLT24 number(5),
MLS number(5),
SliceNum number(5),
CachedTime number(5),
StuckTime number(5),
GetSliceErr number(5),
RetransmitRate number(5),
RepeatRate number(5),
SecondsFlag number(5)
)
partition by list (SECONDSFLAG)
(
partition P1 values (1)
tablespace IPVIEW1
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
)
);