海量数据处理技巧
- 格式:doc
- 大小:35.00 KB
- 文档页数:6
浅谈海量数据处理技巧
摘要随着计算机应用系统不断的发展和完善,在各个领域产生了大量的数据,这些数据有着非常大的查询和分析价值。
但随着数据量的增大,对于如何处理海量数据查询效率的问题,已经迫在眉睫。
关键词海量数据;索引;分表存储
中图分类号tp39 文献标识码a 文章编号 1674-6708(2011)35-0170-02
1 数据源的处理
1.1 文本数据导入到sql server数据库中
主要有以下3种方式:
方式一:通过程序从文本格式的数据中每整理出一条记录就执行insert语句插入到sql数据库中;
方式二:通过程序从文本格式的数据中整理出多条记录,再批量执行insert语句插入到sql数据库中;
方式三:编写存储过程,把这些从文本格式的数据通过存储过程导入到sql数据库中。
因为,存储过程提供了许多标准sql语言中所没有的高级特性。
其传递参数和执行逻辑表达式的功能,有助于应用程序设计者处理复杂任务。
另外,这些过程存储在本地sql 服务器上,减少了执行该过程所需的网络传输带宽和执行时间。
1.2 数据库的设计
1.2.1 数据的分表存储
在诸多应用系统的数据库中,例如,淘宝中店家的销售记录、买家的购买记录、北美贸易数据、医院医生的接诊数据等等,这些数据都有时间这一维度。
以北美贸易数据为例,每月的北美海关贸易数据至少上百万条,一年的数据量至少在千万条以上。
试想,假如系统要搜寻某个月份,某一hs号的产品出口信息,实际最后所得的数据量可能仅仅是几百条甚至更少只有几条。
那么,如果从一百万条数据里搜寻这些,和在上千万条数据里搜寻,他们的返回结果时间必然是不同的。
同样,修改记录时,数据库也是要先找到满足条件的记录,然后再进行update操作。
所以,建议处理这类数据时候,应该按照时间这一维度,把数据分表存储。
这样,可以减少大量的查询时间,数据量越庞大,效果越明显。
1.2.2对海量数据进行分区操作
对海量数据进行分区操作十分必要,例如针对按年份存取的数据,我们可以按年进行分区。
例如sql server的数据库分区是将不同的数据存于不同的文件组下,而不同的文件组存于不同的磁盘分区下,这样将数据分散开,减小磁盘i/o,减小了系统负荷,而且还可以将日志、索引存放于不同的分区下。
1.2.3 创建索引
1)索引的优点和局限索引可以提高查询的效率,但会降低dml 操作的效率。
所以建立索引时需要权衡。
对于dml操作比较频繁的
表,索引的个数不宜太多;
2)什么样的列需要建索引经常用于查询、排序和分组的列(即经常在where、order或group by子句中出现的列);
3)主键索引和复合索引对于一张表的主键,系统会自动为其建立索引。
如果一张表的几列经常同时作为查询条件,可为其建立复合索引;
4)建立索引的语句createindexi_staffonstaff(empno);
createindexi_agentonagent(empno, start_date);
5)删除索引的语句dropindexi_staff;dropindexi_agent;
6)索引的一些特点:
(1)不同值较多的列上可建立检索,不同值少的列上则不要建。
比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就没必要建立索引。
如果建立索引不但不会提高查询效率,反而会严重降低更新速度。
(2)如果在索引列上加表达式,则索引不能正常使用
例如:b1是表b的索引列
select*frombwhereb1/30< 1000 ;这是不正确的写法
where子句中如果使用in、or、like、!=,均会导致索引不能正常使用
例如:select*frombwhereb1=30orb1=40;
1.2.4 创建索引表
除对数据表的相应列上创建索引、复合索引,我们还可以给数据表创建“索引表”。
例如,当需要进行模糊查询的时候,我们一般采取的解决办法是执行sql语句 like
select * from table where 某列 like ‘%×××××%’,这样如前所述,即便该列已经加了索引,在进行like查询时候,索引也起不到任何作用。
那么,这种情况,应该怎么处理呢?
我们以搜寻北美数据为例,假设一个表中存有一百万条数据,那么我们可以设计这个表有一个pk_id列(长整型)来唯一标识一条记录。
表中存在一列是描述信息列。
该列的内容都是英文字母。
这样,我们通过程序,先将该月数据进行处理,创建26套索引表,每个索引表有两个列,一列(skey)存放关键字,一列(sid)存放这些关键字在数据主表中出现的那些记录的pk_id(以某一特定分隔符来分割表示。
例如第 1、3、5 这3条记录中存在关键字“toy”那么在 t索引表中有这样一条记录,toy1,3,5)。
这样,如果程序要搜索关键字是“toy”的信息记录。
执行过程是这样的:首先从t索引表中,用“selecttop 1 sid fromt索引表 where skey =’toy’” ,然后得到主数据表中的pk_id 为 1、3 、5 这三条记录是含有关键字“toy”的记录。
这时,再执行“select * from maindata where pk_id in(1,3,5)”,得到所需数据。
经过实际测试,用上述方法,比直接采用“select * from maindata
where描述信息列 like ‘%toy%’”方式,系统返回结果的时间要快十倍以上,特别是在单表数据量超过百万后,效果更佳突出。
2 程序设计的一些技巧
2.1 界面显示进度
当程序处理大量数据的时候,往往系陷入“假死”状态。
这时,很多用户会觉得系统很慢、已经导致死机等。
遇到类似情况,在程序在设计时候,可以在程序界面上,显示处理的进度。
一般采用进度条或处理比例(已处理数量/总数量)这样的方式展现,并实时刷新数据,这样,用户从程序界面上,看见有不断的数字变化,从心里上有种感觉,程序在飞速处理着数据。
对实时刷新数据的一个窍门:很多时候,程序设计了实时刷新界面的信息,但由于后台正在处理大量的数据,导致了cpu时间没有分配给刷新程序界面。
这时候程序一样是假死的状态。
此时,可以在刷新界面数据的语句后面加上转让控制权的函数,让cpu来处理。
例如 doevents 函数。
2.2 仅显示出部分信息
此种情况,一般用于搜索查询显示。
当用户搜索某一内容后,得出的结果可能会有成千上万条。
如果程序要把这些结果,都搜索出来并显示到界面上速度一定很慢。
以大多数用户搜索的习惯,一般只会看前十条记录,之后就会细化搜索的条件或搜索其他内容,不会将所有的搜索结果全部浏
览。
这样,程序只要搜索出前面的部分记录就可以,
利用 select top 10 from table where ***** 就可以实现此功能。
同时,需要记录此十条记录的 pk_id ,如果用户继续查看后续的内容,那么再进行搜索的时候要排除掉先前已经显示的记录。
2.3 数据的预处理
对一些固定条件下汇总的数据信息,可实现将数据汇总,存储到数据库中。
这样,在程序汇总该数据时,只需从数据库中读取出该条记录即可,不需要再进行。
2.4 c/s(b/s)架构的程序设计:充分利用服务器端处理
对大量的数据运算操作,尽量放到服务器端,充分利用服务器高效的处理能力、高速的读写能力,来处理客户端提出的需求。
客户端只用来显示服务器端处理的结果和提交处理请求。
这样可以大幅提高程序的处理速度。
参考文献
[1][美]john papa,matthew shepker,等著.机械工业出版社,2000,1.
[2]百度文库 sql效率之索引.。