我在前年遇到过过亿条的数据。以至于一个处理过程要几个小时的。后面慢慢优化,查找一些经验文章。才学到了一些基本方法。综合叙之,与君探讨之。
1. 数据太多。放在一个表肯定不行。
比如月周期表。一个月1000万,一年就1.2亿,如此累计下去肯定不行的。所以都是基于一个周期数据一个表。甚至一个周期数据就要分几个分表。主要是考虑实际的数据量而定。当你创建一个新表时,可能这个表需要有索引,但是都要先取消索引,或者先建立表,导入数据后,再建立索引。
必要时处理完,统计完后,就备份到磁带或者其他介质。然后清掉。
从问题域来看,一个周期内的数据关联性最大。比如统计一个客户某个帐期的话单总额,同比上月增幅,还有就是零话费客户等。如此种种,参照的数据不外乎本周期,或者两个周期,甚至更多就是一个季度,或者半年的样子(类似三个月连续零话费,或者三个月连续欠费未交之类的,保存量之类的报表可能会要一年的数据)。而且这样的情况在数据挖掘或者高级管理报表中比较常见,一般营业部门使用的界面中,是不可能含有这样的统计的。
所以数据按表分开,甚至于可以按数据库分开,更便于管理。
大家要打消一种固有的思路,这些数据,跟环卫工人处理垃圾一样,是几乎有点带人工处置的多步骤方式,也就是不会作为常规数据(如客户基本资料等)长期存在和频繁使用的。所以我们可以改变思路,就是想尽办法,在需要的时候,做最佳处理,而在不需要时,清理掉它。也就是说,比如分表,你可以分100个表,1000个表都可以。只要方便统计和得到所需数据即可。
view只是说你能在写select语句时简单一点,对速度没有任何提高。
主要是,你的分表的方式能建立减少访问所有数据,就能提高速度。比如你做某个统计,那些数据恰好在某个分表内。举例说,你有10个分部,而你统计id=1这个分部时,你恰好把数据放在第一个分表里,你就可以在存储器内通过判断,只访问第一个分表,从而提高统计速度。如果你的统计需要统计全部分表内的数据,那处理速度还是一样慢。
2. 假设每个表的数据在数十万条,那统计起来是没有任何瓶颈的。常规的数据库都应该没任何问题。
3. 预处理的必要性。
有人问:我统计一千万条数据汇总,要多久多久,能否提高。。。试想你把中国人所有的存款加总,需要多长时间吧?看看这个问题的规模,其实再复杂的数据库dbms,我们说他都逃不过:找出符合条件的数据,一条一条的加总这个计算过程。暂且不提where条件了。预处理的必要性在于,如此规模的数据处理,本身就是一个非常耗时的过程,我们有必要提前,处理其结果到一个表内,或者多个表里面。用户查询时,再显示出来。比如说1000万数据分10个分部,要看每个分部的应收增长,那我们可以预先统计数据到分部费用表中,则用户端报表显示时,就非常快。如果任何数据汇总都要从原始数据去统计,那是不现实的。所以我们可以设置原始数据表,中间结果表,结果表,汇总表,月结表,期间表之类的东西。逐步统计归属。
另外要提的是,这样的动作肯定非常耗时,而且!这样的数据如果由服务器的存储过程定期定时执行的话,处理的规模就只有一次,任何客户端,都只从结果表里产生报表。如果不用此方法,任何客户端报表都从原始数据产生,理论上是可以,但是这样的千万条数据汇总的处理会做N次。而且时间上也是不容许的。
还有,这样的统计过程最好是分开db进行存放,而公用的数据比如客户基本资料,最好拷贝一份到这个新db中来处理。这样可以不干扰到正常的使用。
可以在晚上,或者另开db或者在另外的server上跑这个过程。处理完后,写一个标志告诉主db,则客户端可以统计这些报表了。
4. 对单行数据做计算字段。举个例子,比如一条记录的产生时间是2009-01-01 12:00:00.001,如果你的统计刚好需要对某个时段进行统计,那最好增加字段,比如hour字段,下一个批处理命令下去,取得小时数,然后再统计。
5. select语句中忌讳对column做函数。因为函数将导致查询条件不走索引,而改走遍历所有数据。这样你就是查一条数据,也会遍历所有数据,那岂不是可怜。
6. 条件尽量都是数字,也就是都用id,比如分部,镇区,业务种类,接入类型,客户地址,等等,都需要用到fk方式的编码,主表里只用数字id,请记住是数字型id。整数型数字是计算最快的数据类型。如果金额极大,可以用decimal(小数=0)。varchar类型是效率很低的,不过好像有sql的md5算法,我想可以尝试这个方法(我还没试过)。
7. 索引,这个是海量数据查询首要解决的问题。
没有索引,就是遍历。索引没有覆盖到,也会走遍历。
8. 复杂的统计,用存储器做分步处理,然后得到结果,同比一条select语句实现要轻松和明白得多。
而且对表的占用时间要短得多。当然,很复杂的统计可能要用到条件判断,循环等,一条select语句是无法处理的。多层的where中的子句也是效率低,容易占用表的写法。
原则上,这里我所讨论的问题都不是那种基于网站内容管理的小case,主要对企业运用而言。比如举例说查一个“存量客户增幅表”,问题都不是简单到直接对比两个月的话费总额这么简单,还得找出之前他的话费如何,比如超过多少钱的才列入统计对象。所以,我的理解:复杂的问题,必须存储过程。真正做过几个项目才会明白,写sql语句会比编程代码还要多。真正的程序,其实是sql。
最后说一句,如果经验足够丰富,写出的统计过程,其执行时间在数分钟甚至几个小时都是正常的。所以初学者应该明白,数据量是与处理时间成正比的。如果平时处理几条数据感觉很快,数据量猛然增加几个数量级,不要认为时间上还能优化到几秒钟。
ERP里的MRP展开计算,通常能到几个小时的。这都是正常的。(主要是物料多,bom多,计算步骤太多造成)
9. 补充一点。如果数据量超过我们标题的千万级,甚至几十亿数量级。那也不存在问题,还是分而治之的思路,就是把数据在多台服务器上并行运行。就好像为灾区捐款一样,靠一个人的力量是不行的。人多力量大。类似数据分拣之类的,只需要原始数据和基本资料,还有一些计费策略之类的。完全可以分布在多台server上同时处理,也是必要的。主要根据你的数据量和单台处理的速度以及你要求的总的处理时间而决定的。有人说select语句难道也需要分布?只能说,如果确实有必要,也能做到。比如你要返回所有话单异常的数据,那也可以从每台执行检索,然后汇合到一起,我想是可以的。
10.补充二点。数据提前分拣!
举例,电话的计费数据,有钟错误是计费时长超级大,比如通话3个小时。这种基本是错误的。有可能是数据错误。所以之前碰到客户说要把计费错误的提出来。如果每次查询都要从原始表去select当然不是个好办法。所以好办法就是做必要的分拣。这样的异常数据毕竟不多。比如一个月3000条,单独放入一个table中,这样客户检索和处理时,就非常快。
一句话:提前把需要的数据过滤出来放在规定位置。
/*-----------------------------------------------------------------------------*/
总而言之:
一。合理设计表结构,使得统计汇总最高效(包括fk设计和用数字id,不用varchar,索引设计,计算字段);
二。合理分表,使得单表数据规模适当;
三。用存储器分多个步骤处理。
四。数据预先处理和数据分拣。
五。分布在多台server上同时处理。
也就是分而治之与预处理。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chengg0769/archive/2009/07/09/4332791.aspx
分享到:
相关推荐
在处理千万级甚至过亿数据规模的数据库时,面临的主要挑战是如何有效管理和优化数据处理,以提高查询效率和系统性能。以下是一些关键知识点和策略: 1. **数据分区与分表**:当数据量巨大时,单一表的管理变得困难...
SQL Server是一种企业级的关系数据库管理系统,它设计用于处理大规模数据,提供高效的数据存储、查询和分析功能。对于百万级的数据,SQL Server能提供稳定且高性能的解决方案。它可以快速执行复杂的查询,并通过索引...
学习数据库系统概念不仅需要掌握SQL语言,还需要理解关系数据库的基本原理,如范式理论(第一范式、第二范式、第三范式和BCNF),事务处理,以及索引优化等。这些知识点都是数据库管理员、数据分析师和软件开发者...
SAP HANA数据库是一种内存计算型数据库,它提供了高性能的数据处理能力,特别适合处理实时分析和业务应用。在SAP HANA体系中,SQL语言的使用规则十分关键,它规定了如何在SAP HANA中执行数据的增加、删除、修改和...
在IT行业中,数据库性能优化是至关重要的,尤其是在处理百万级数据量时。本文将深入探讨数据库面试中的常见问题,特别是关于SQL优化和针对大规模数据库的优化策略。首先,我们来看看"数据库面试题索引sql优化.pdf...
1、对ms sql server及其他数据库库中类似int identity的数据库类型没有处理,转出来的sql语句直接执行时,还需要做一下处理. 2、不支持长字符集类型.比如ms sql server中的image,oracle中的blob,clob,long以及db2中...
全国的大学名录数据库sql文件,有近20万条数据,非常适合做需要填写会员学校名称的网站
省市区4级联动的数据库,只有数据库文件,建议的千万别选择购买下载
标题 "全世界国家及城市数据库数据(SQL语句)" 提供了一个关于全球地理信息的数据集,这个数据集是通过SQL语言构建的,适用于数据库管理。SQL(Structured Query Language)是用于管理和处理关系数据库的标准编程...
SAP-HANA数据库SQL中文完全参考手册,本文档完全翻译为中文,适合看不懂原版官方英文文档的人,内容做了精美的排版,里面包括各种函数,语法,限制信息等。内容非常完备,掌握这本手册,相信一定能掌握HANA
包含省市区街道4级数据,sql数据表,还有一个用c#写的抓取国家统计局最新数据的程序,可以扩展成5级!
数据库设计文档通常包含数据字典、ER图、SQL脚本等。 在实际项目中,这些模板可以作为指导,帮助开发者规范化工作流程,提高文档质量和开发效率。每个模板都应根据项目的具体情况进行定制,以确保满足实际需求。...
2018全国省市县镇村5级数据库,抓取来源于国家统计局,精心校对,可直接导入数据库使用
数据库包含的“新华字典.mdb”和“新华字典.sql”文件,分别可能代表了使用Microsoft Access数据库格式和SQL语言存储的数据,方便用户进行查询、分析和进一步的数据处理。这样的数据库对于现代信息技术环境下的汉字...
全国省市数据库 二级 sql语句全国省市数据库 二级 sql语句全国省市数据库 二级 sql语句全国省市数据库 二级 sql语句全国省市数据库 二级 sql语句
它提供了一整套强大的数据管理工具,能够处理大规模的数据存储和处理需求,对于像天堂2这样需要处理大量并发操作的在线游戏来说,是一个理想的选择。 在天堂2 CT2.3的数据库设置中,我们可以看到用户名为“gamma”...
本篇文章将深入探讨如何将Siemens S7 1200 PLC连接到SQL Server数据库,以便于数据的存储、查询和处理。 首先,理解基本概念。PLC是一种专为工业环境设计的计算机,用于控制自动化设备。S7-1200是西门子的紧凑型PLC...
达梦数据库是国产数据库的杰出代表,其SQL语言使用手册详细介绍了DM_SQL语言的特点、支持的数据类型、表达式、运算符优先级、数据库模式以及具体的语法命令和操作示例,使用户能够熟练掌握并使用达梦数据库进行数据...
实验报告“SQL数据库实验报告”涵盖了SQL语言的基础到高级应用,包括了数据库的创建与表的使用、SQL查询、视图、完整性约束、存储过程以及嵌入式SQL的使用。以下是对这些知识点的详细说明: 1. **数据库的创建和表...