浅谈海量数据处理技巧

时间:2022-06-03 06:44:38

浅谈海量数据处理技巧

摘要 随着计算机应用系统不断的发展和完善,在各个领域产生了大量的数据,这些数据有着非常大的查询和分析价值。但随着数据量的增大,对于如何处理海量数据查询效率的问题,已经迫在眉睫。

关键词 海量数据;索引;分表存储

中图分类号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)建立索引的语句create index i_staff on staff (empno);

create index i_agent on agent (empno, start_date);

5)删除索引的语句drop index I_staff;drop index I_agent;

6)索引的一些特点:

(1)不同值较多的列上可建立检索,不同值少的列上则不要建。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就没必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。

(2)如果在索引列上加表达式,则索引不能正常使用

例如:b1是表b的索引列

select * from b where b1/30< 1000 ;这是不正确的写法

where子句中如果使用in、or、like、!=,均会导致索引不能正常使用

例如:select * from b where b1=30 or b1=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效率之索引.

上一篇:浅谈如何提高公共场合的消防报警措施 下一篇:东庞矿岩巷快速掘进设备配套及现场施工研究