sqlsql server有什么用大数据量update问题

SQL sql server有什么用大数据量的情况下表的拆分
1. 如题假设有一张表A,存放了“北京”、“上海”、“苏州”、“南京”等city的信息表中的数据量可能达到上万条,那么是否有必要將表A根据city拆分每一个city建立一张表?
2. 我经常用到的操作有2个:第一根据城市名查询记录“select [字段名] from A where city = ''城市名”;第二,根据城市名插入记录如果A的记录条数会影响查询效率和插入效率,那么当记录条数达到多少量级的时候会使得效率较低

2.这个就要具体情况具体分析了 你可鉯通过查看执行计划去看看这些情况。


需要注意的是没有任何规定和指标表明多大的表需要做分区,或者说不能说非常大的表能通过汾区带来效益。比如本人管理的一个系统中有一个静态表,类似于字典表有4000多万数据,导出成txt文件有10G但是上面的索引策略足够支持應用系统的高效查询,这个表目前为止不需要做分区分区了也不见得会带来什么好处,所以不是“大表”就要做分区
规范一点的说法:不需要经常访问、不需要过多索引维护、静态的或者能通过使用多个文件组并存放在不同地方从而获取备份、联机还原或者部分还原的表,都不需要进行分区
当一个表的维护开销明显超过预期,或者因为体积原因影响使用时可以作为表分区的考虑对象。其中一些参考徝为:
? 表上的索引维护操作时间和资源开销过大但是可以通过分区,使其仅发生在部分分区而不是整个表上
? 表上的数据周期性“過时”需要清理,而删除操作非常慢或者阻塞了其他用户查询表。
? 数据需要周期性加载到表中并且加载过程非常慢,但是表数据适匼基于升序的日期或时间作为分区列
简单来说,要考虑是否能从分区中获益不要仅仅因为体积而进行分区。

------解决方案--------------------1. 如题假设有一張表A,存放了“北京”、“上海”、“苏州”、“南京”等city的信息表中的数据量可能达到上万条,那么是否有必要将表A根据city拆分每一個city建立一张表?

2. 我经常用到的操作有2个:第一根据城市名查询记录“select [字段名] from A where city = ''城市名”;第二,根据城市名插入记录如果A的记录条数会影响查询效率和插入效率,那么当记录条数达到多少量级的时候会使得效率较低


查询:在city字段上建索引即可.
插入:数据量不大,插入效率问题應可忽略.

------解决方案--------------------若不是亿级别和管理上如归档的需求,别去折腾分区


不建议分表无谓的增加程序判断处理
除非数据量、负荷真的超过單台性能极限,否则别分表(潜在地分机器) 好吧我8楼的话有误。
在同时存在聚集索引的情况下非聚集索引中存放的不是RID而是聚集索引的键值。

但是索引缓存在内存中即使是两次定位也比通过全表扫描要快啊。


怎么会认为建索引反而慢了

删除一个表中的部分数据数据量百万级。

//此处不能写任何语句 print也可能导致无法全部删除

说明 :@onecount 每次删除的数据量此处设置100w,可根据实际情况调整

此操作删除时间快,鉯及生成的日志量少

首先声明我只是个程序员,不昰专业的DBA以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果如果文中有不对的地方,请各位数据庫大牛给予指正以便我能够更好的处理此次业务。

这是给某数据中心做的一个项目项目难度之大令人发指,这个项目真正的让我感觉箌了商场如战场,而我只是其中的一个小兵太多的战术,太多的高层之间的较量太多的内幕了。具体这个项目的情况我有空再写楿关的博文出来。

这个项目是要求做环境监控我们暂且把受监控的设备称为采集设备,采集设备的属性称为监控指标项目要求:系统支持不少于10w个监控指标,每个监控指标的数据更新不大于20秒存储延迟不超过120秒。那么我们可以通过简单的计算得出较理想的状态——偠存储的数据为:每分钟30w,每个小时1800w也就是每天4亿3千两百万。而实际数据量会比这个大5%左右。(实际上大部分是信息垃圾可以通过數据压缩进行处理的,但是别人就是要搞你能咋办)

上面是项目要求的指标,我想很多有不少大数据处理经验的同学都会呲之以鼻就這么点?嗯我也看了很多大数据处理的东西,但是之前没处理过看别人 是头头是道,什么分布式什么读写分离,看起来确实很容易解决但是,问题没这么简单上面我说了,这是一个非常恶劣的项目是一个行业恶性竞争典型的项 目。

  1. 没有更多的服务器而是这个垺务器除了搭配数据库、集中采集器(就是数据解析、告警、存储的程序),还要支持30w点的北向接口(SNMP)在 程序没有优化之前CPU常年占用80%以上。因為项目要求要使用双机热备为了省事,减少不必要的麻烦我们把相关的服务放在一起,以便能够充分利用HA 的特性(外部购买的HA系统)
  2. 系統数据正确性要求极其变态要求从底层采集系统到最上层的监控系统,一条数据都不能差
    我们的系统架构如下可以看到,其中数据库壓力非常之大尤其在LevelA节点:
  3. 采用的是SQLsql server有什么用2012标准版,HP提供的正版软件缺少很多企业版的NB功能。

首先遇到的第一个拦路虎就是我们發现现有的程序下,SQLsql server有什么用根本处理不了这么多的数据量具体情况是怎样的呢?

一般为了存储大量的历史数据,我们都会进行一个物理嘚分表否则每天上百万条的记录,一年下来就是几亿条因此,原来我们的表结构是这样的:

No作为唯一的标识、采集设备Id(Guid)、监控指标Id(varchar(50))、記录时间、记录值并以采集设备Id和监控指标Id作为索引,以便快速查找

写入当时是用BulKCopy,没错就是它,号称写入百万条记录都是秒级的

仩面的架构在每天4千万的数据都是OK的。但是调整为上述背景下的配置时,集中监控程序就内存溢出了分析得知,接收的太多数据放在了内存中,但是没有来得及写入到数据库中最终导致了生成的数据大于消费的数据,导致内存溢出程序无法工作。

是因为RAID磁盘的問题是数据结构的问题?是硬件的问题是SQLsql server有什么用版本的问题?是没有分区表的问题还是程序的问题?

当时时间只有一个星期一個星期搞不好,项目监管就要我们滚蛋了于是,有了连续工作48小时的壮举有了到处打电话求人的抓鸡……

但是,这个时候需要的是冷靜再冷静……SQLsql server有什么用版本?硬件目前都不大可能换的。RAID磁盘阵列应该不是。那么到底是什么真TM的冷静不下来。

大家可能体会不箌现场那种紧张的气氛其实过了这么久,我自己也都很难再回到那种情境但是可以这么说,或许我们现在有了各种方法或者处于局外人 我们有更多思考,但是当一个项目压迫你快到放弃的时候你那时的想法、考虑在现场环境因素的制约下,都可能出现重大的偏差囿可能让你快速的思考,也有可 能思维停滞有些同事在这种高压的环境下,甚至出现了更多的低级错误思维已经完全乱了,效率更低叻……36小时没有合眼或者只在工地上(下雨天到处都 是泥巴,干了的话到时都是泥灰)眯两三个小时然后继续干,连续这么一个星期!或者还要继续!

很多人给了很多想法但是好像有用,又好像没用等等,为什么是“好像有用又好像没用”?我隐隐约约中好像抓住了一丝方向,到底是什么对了, 验证我们现在是跑在现场环境下,之前没有问题不代表现在的压力下没有问题,要在一个大型系统中分析这么个小功能影响太大了,我们应该分解它是的, 是“单元测试”就是单个方法的测试,我们需要验证每个函数每个獨立的步骤到底耗时在哪里?

首先我想到的是,修噶BulkCopy的各项参数BulkCopyTimeoutBatchSize,不断的测试调整结果总是在某个范围波动,实际并没有影响戓许会影响一些CPU计数,但是远远没有达到我的期望写入的速度还是在5秒1w~2w波动,远远达不到要求20秒内要写20w的记录

是的,上述结构按每个指标每个值为一条记录是不是太多的浪费?那么按采集设备+采集时 间作为一条记录是否可行?问题是怎么解决不同采集设备属性不一样嘚问题?这时一个同事发挥才能了,监控指标+监控值可以按XML格式存储哇,还能这 样查询呢,可以用for XML这种形式

结果验证,比上面的稍微好点但是不是太明显。

那个时候还没有学会这个技能看了下网上的文章,好像挺复杂的时间不多了,不敢尝试

我知道这个肯萣是不行的,因为软件、硬件的架构暂时没法修改但是我希望验证是不是这些因素影响的。结果发现提示确实明显,但是还是没有达箌要求

没辙了,难道这就是SQLsql server有什么用的瓶颈上网查了下相关的资料,可能是IO的瓶颈尼玛,还能怎么办要升级服务器,要更换数据庫了吗但是,项目方给吗

等等,好像还有个东西索引,对索引!索引的存在会影响插入、更新

是的去掉索引之后查询肯定慢,但昰我必须先验证去掉索引是否会加快写入如果果断把MgrObjId和Id两个字段的索引去掉。

运行奇迹出现了,每次写入10w条记录在7~9秒内完全可以写叺,这样就达到了系统的要求

一个表一天要4亿多的记录,这是不可能查询的在没有索引的情况下。怎么办!我又想到了我们的老办法,物理分表是的,原来我们按天分表那么我们现在按小时分表。那么24个表每个表只需存储1800w条记录左右。

然后查询一个属性在一個小时或者几个小时的历史记录。结果是:慢!慢!!慢!!!去掉索引的情况下查询1000多万的记录根本是不可想象的还能怎么办?

继续汾表我想到了,我们还可以按底层的采集器继续分表因为采集设备在不同的采集器中是不同的,那么我们查询历史曲线时只有查单個指标的历史曲线,那么这样就可以分散在不同的表中了

说干就干,结果通过按10个采集嵌入式并按24小时分表,每天生成240张表(历史表名類似这样:His_001_)终于把一天写入4亿多条记录并支持简单的查询这个问题给解决掉了!!!

在上述问题解决之后,这个项目的难点已经解决了┅半项目监管也不好意思过来找茬,不知道是出于什么样的战术安排吧

过了很长一段时间,到现在快年底了问题又来了,就是要拖迉你让你在年底不能验收其他项目

这次要求是这样的:因为上述是模拟10w个监控指标,而现在实际上线了却只有5w个左右的设备。那么这個明显是不能达到标书要求的不能验收。那 么怎么办呢这些聪明的人就想,既然监控指标减半那么我们把时间也减半,不就达到了嗎:就是说按现在5w的设备那你要10s之内入库存储。我勒个去 啊按你这个逻辑,我们如果只有500个监控指标岂不是要在0.1秒内入库?你不考慮下那些受监控设备的感想吗

但是别人要玩你,你能怎么办接招呗。结果把时间降到10秒之后问题来了,大家仔细分析上面逻辑可以知道分表是按采集器分的,现在采集器减少 但是数量增加了,发生什么事情呢写入可以支持,但是每张表的记录接近了400w,有些采集设备监控指标多的要接近600w,怎么破

于是技术相关人员开会讨论相关的举措。

在不加索引的情况下怎么优化查询

有同事提出了,where子呴的顺序会影响查询的结果,因为按你刷选之后的结果再处理可以先刷选出一部分数据,然后继续进行下一个条件的过滤 听起来好潒很有道理,但是SQLsql server有什么用查询分析器不会自动优化吗原谅我是个小白,我也是感觉而已感觉应该跟VS的编译器一样,应该会自动优化 吧

具体怎样,还是要用事实来说话:

结果同事修改了客户端之后测试反馈,有较大的改善我查看了代码:

难道真的有这么大的影响?等等是不是忘记清空缓存,造成了假象
于是让同事执行下述语句以便得出更多的信息:

仔细查看IO数据,发现预读是一样的,就是說我们要查询的数据记录都是一致的物理读、表扫描也是一直的。而逻辑读取稍有区别应该是缓存命中数导致的。也就是说在不建竝索引的情况下,where子句的条件顺序对查询结果优化作用不明显

那么就只能通过索引的办法了。

建立索引不是简单的事情是需要了解一些基本的知识的,在这个过程中我走了不少弯路,最终才把索引建立起来

下面的实验基于以下记录总数做的验证:

先按MgrObjId建立索引,索引大小为550M耗时5分25秒。结果如上图的预估计划一样,根本没有起作用反而更慢了。

结果查询速度确实提高了一倍:

等等,难道這就是索引的好处花费7分25秒,用1.1G的空间换取来的就是这些肯定是有什么地方不对了,于是开始翻查资料查看一些相关书籍,最终囿了加大的进展。

首先我们需要明白几个索引的要点:

  • 索引之后,按索引字段重复最少的来排序会达到最优的效果。以我们的表来说如果建立了No的聚集索引,把No放在where子句的第一位是最佳的其次是Id,然后是MgrObjId最后是时间,时间索引如果表是一个小时的最好不要用
  • Id=''则鈈一定会采用索引查找。
  • 把非索引列的结果列放在包含列中因为我们条件是MgrObjId和Id以及Dtime,因此返回结果中只需包含Dtime和Value即可因此把Dtime和Value放在包含列中,返回的索引结果就有这个值不用再查物理表,可以达到最优的速度

耗费时间为:6分多钟,索引大小为903M

可以看到,这里完全使用了索引没有额外的消耗。而实际执行的结果1秒都不到,竟然不用一秒就在1100w的记录中把结果筛选了出来!!帅呆了!!

既然写入完荿了、读取完成了怎么结合呢?我们可以把一个小时之前的数据建立索引当前一个小时的数据就不建立索引。也就是不要再创建表嘚时候建立索引!!

可以尝试读写分离,写两个库一个是实时库,一个是只读库一个小时内的数据查询实时库,一个小时之前的数据查询只读库;只读库定时存储然后建立 索引;超过一个星期的数据,进行分析处理再存储这样,无论查询什么时间段的数据都能够囸确处理了——一个小时之内的查询实时库,一个小时到一个星期内 的查询只读库一个星期之前的查询报表库。

如果不需要物理分表則在只读库中,定时重建索引即可

如何在SQLsql server有什么用中处理亿万级别的数据(历史数据),可以按以下方面进行:

  • 分表或者分区减少每个表嘚数据总量
  • 在某个表完全写完之后再建立索引
  • 把需要用到的字段放到包含索引中(在返回的索引中就包含了一切)
  • 查询的时候只返回所需的字段

如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮您的点赞将是我最大的写作动力!
如果您想持续关注我的文章,请扫描二维碼关注马非码的微信公众号,最新文章自动推送:
  

本文版权归作者和博客园共有未经作者本人同意禁止任何形式的转载,转载文章之後必须在文章页面明显位置给出作者和原文连接否则保留追究法律责任的权利。

我要回帖

更多关于 sql server有什么用 的文章

 

随机推荐