日期:2014-05-17  浏览次数:20315 次

大数据量问题又来啦,请高手围观!
现在数据库里有十几张表,每张表的数据过几千万。
为了提高查询的效率,现在想把这十几张表,按表里的数据类型再分成子表,分下来大概有6000多张子表,因为查询的时候主要是按这个数据类型为条件再外加其他条件进行查询的,这样分下来的话每张表里只存这个类型的数据,数据量会缩小,查询效率应该会提高,但不知道这么多表会有其他什么影响?
还有就是除了加索引外还有其他什么好的方案能解决这几千万甚至上亿数据查询效率问题?

而且这十几张表里的数据是在每天更新的,加索引可能会影响更新速度。现在的更新方式是直接把原来的全部删掉,然后insert,由于数据量比较大,删除数据时没有用delete(比较慢),而是直接drop掉表,然后重建,这样有没有什么问题隐患?

------解决方案--------------------
  为什么 不做成  分区表呢?  按 这个类型 list分区  
------解决方案--------------------
但不知道这么多表会有其他什么影响?
--> 虽然分小表的数据量会缩小,但始终还是会增加上来的,到时如何处理.
    且前端程序需大量使用动态SQL查询,修改工作量较大.

接drop掉表,然后重建,这样有没有什么问题隐患?
--> 从drop表到重建,导入大数据量完成,需一定的时间,期间查询会报错: 找不到表xxx.
    且大数据量导入,会使日志文件暴涨.

可以考虑分区表方案,
或把历史数据(例如N年前的)归档到历史数据库中,有需求才去查询.

------解决方案--------------------

1.这么多表对系统应该没什么影响,但是这么多表加重了管理这些表的负担,相当于你使用管理的复杂性,来换取了性能,这种思路是对的。
  我建议如果可以的话,把原来的表按照你说的数据类型,改为分区表,但你说拆分后有6000多个表,SQL server 2008r2的分区表只能支持1000个分区,那么可能还得把有些数据类型放到一个分区表中,另外,导入数据时,可能的一个一个类型倒入,比如类型1导入到表1,然后把这个表1加入到分区表中,这样做的好处是非常快。
   也就是说采用了分区表,其实管理的复杂性也有上升,但性能和方便程度,都有大幅提高。
   不过有个问题是,好像2008r2分区表,只支持range分区,好像不支持list分区。所以,你这个问题,要修改为分区表,也有一定的困难。

3.你说由于delete太慢,直接通过drop来删除数据,然后重建,其实直接用truncate删除数据,应该就很快的,不用一定要drop后再重建的。
  本来比如有1000条数据,那么需要删除其中的500条,然后再加载新的500,最后还是1000条,既然你可以drop表,说明你现在导入数据时,是全量导入,就是把以前的数据,和新的数据,一起导入,这样就避免了delete太慢的问题,确实是一个办法,因为(drop+全量导入+重建表)时间 < (delete+新数据导入)时间。 

  你说你的更新方式是每天都是更新的,因为看你说的意思,应该是批量更新的,不是每秒都有更新的,是佛可以考虑在更新的时候把索引禁用,然后在导入完成后重建索引,就可以了,另外,不用drop表,直接truncate表就可以了。

2.要解决这种大数据量的查询问题,还是得建索引,索引是提高查询速度的关键,要想快,就得建索引哈。

------解决方案--------------------
做分区表吧,不用INSERT 之类的 ,Switch就是 元数据级别的,不涉及数据的移动 性能好很多 ,而且简化你的维护。 

大数据如果只是查询少量的数据还是要靠索引,分区表的索引会更快。 
------解决方案--------------------
删除表再建表,怎么会比更新数据快?
几千万条也不多啊,查询速度快慢与索引和查询语句本身的关系更大一些!
------解决方案--------------------
引用:
Quote: 引用:


1.这么多表对系统应该没什么影响,但是这么多表加重了管理这些表的负担,相当于你使用管理的复杂性,来换取了性能,这种思路是对的。
  我建议如果可以的话,把原来的表按照你说的数据类型,改为分区表,但你说拆分后有6000多个表,SQL server 2008r2的分区表只能支持1000个分区,那么可能还得把有些数据类型放到一个分区表中,另外,导入数据时,可能的一个一个类型倒入,比如类型1导入到表1,然后把这个表1加入到分区表中,这样做的好处是非常快。
   也就是说采用了分区表,其实管理的复杂性也有上升,但性能和方便程度,都有大幅提高。
   不过有个问题是,好像2008r2分区表,只支持range分区,好像不支持list分区。所以,你这个问题,要修改为分区表,也有一定的困难。

3.你说由于delete太慢,直接通过drop来删除数据,然后重建,其实直接用truncate删除数据,应该就很快的,不用一定要drop后再重建的。
  本来比如有1000条数据,那么需要删除其中的500条,然后再加载新的500,最后还是1000条,既然你可