首页 新闻 会员 周边 捐助

救命! 海量数据多表查询? 提速

0
悬赏园豆:100 [已解决问题] 解决于 2012-04-17 17:41

Sql2008 R2 

(1)有4个视图,每一个视图,来自6张表, 这个视图有2800万行数据,查询非常慢可能要10个小时,甚至没结果,电脑挂掉,想提速,给点建议吧,有时候,where条件复杂了程序执行几十分钟后挂掉,查不出结果的.

(2)每张表之间没有主外建关系,或者没有主键,【但有索引】,因为数据是从HIS系统采集过来的.所有数据只需要查询,不需要修改和删除.

(3)大部分表有70-80列, 单个表 最多 600万行记录.

(4)用户需要提交非常复杂的 where 条件 以对数据统计. 

例如 年月日,姓名,数量,次数,科次等20个以上的条件.

(5)

过程大概分2步, 
1: 按用户提交的where 条件筛选数据,形成一张非常大的 临时表或称做table的.
2:在第1步筛选的基础上进行count,sum等40个或以上的统计,再返回结果,可能还有其它嵌套统计或判断
每次提交的where 条件是动态的

问题补充:

:)这是前人建的表结构和数据库,数据每天有程序自动采集来自HIS系统。
a)来自6张表是因为业务逻辑复杂。统计结果页面要显示50列,即有50个sum,count这样的统计,包括但不限于count这样的统计结果,同时还要能分页,即结果可能有千万行,分页显示,每页显示50条。
b)视图上关键列上己经建立了索引。今天我count了下,单个表就有1400万行。

c)关键的问题是:70列的表,每一列都有可能用来被当作where条件,例如 where A列=>3 and b列=999 and c列。。。这样会有20-40或不确定列的条件。

mick100ey的主页 mick100ey | 初学一级 | 园豆:75
提问于:2012-04-10 17:24
< >
分享
最佳答案
0

这样的数据量应该不算海量,合理的视图索引应该可以解决,必要的时候用空间换时间也是可以的

收获园豆:12
John29 | 小虾三级 |园豆:825 | 2012-04-17 11:28
其他回答(9)
0

建议重新分析需求,把count,sum的统计信息放到一张表中,定时更新这些统计数据。另外为什么视图中的数据要来自6张表呢,建议看下是否可以适当添加冗余字段,避免这么多的视图查询。

收获园豆:11
玉开 | 园豆:8822 (大侠五级) | 2012-04-10 18:27

把统计结果COUNT,SUM放在表中,不要每次都重复计算。

支持(0) 反对(0) 玉开 | 园豆:8822 (大侠五级) | 2012-04-11 08:59
0

数据量过大时,需要考虑数据库结构设计。不能采用单一表设计,也不能唯一依靠索引。

可以试一下千万数据一个表的查询速度。主键、索引、普通列的分别速度。

收获园豆:11
lucika.zh | 园豆:54 (初学一级) | 2012-04-10 18:28
0

sqlserver2008 千万级的数据量应该可以应付把,

可以尝试建立视图索引,可以在类似的学习科目上建立位图索引(如果只是OLAP)

收获园豆:11
风吹柳絮非 | 园豆:220 (菜鸟二级) | 2012-04-10 18:52
0

分析需求,重构数据库设计;空间换时间,根据业务需要提前汇总数据并缓存数据;千万级数据量还算不上海量。

收获园豆:11
风生水起 | 园豆:213 (菜鸟二级) | 2012-04-10 23:51
0

这种数据分析类的,当然要用OLAP了,,研究一下数据仓库吧,

否则你的问题解决不了,

收获园豆:11
freeya | 园豆:213 (菜鸟二级) | 2012-04-11 08:49
0

数据应该不算海量,具体问题要具体分析,普适原则还是可以说说的,表的索引中,应该要设计主键,要充分利用聚集索引,Where 条件多没关系的,只要有个别条件能够利用上聚集索引就很好了。另外避免过多的Join, 避免过于复杂的Sql语句,就是把一条过于复杂的语句分割成多条比较简单的语句。另外不要创建临时表了吧,就是(5)不要分两步,直接一步好了。因为你只是Sum(), Count()什么的。另外Sql Server的配置上有个索引所用的内存适当加大。Sql Server服务器的硬件内存配置也要加大。

收获园豆:11
ChatinCode | 园豆:2272 (老鸟四级) | 2012-04-11 09:15
0

可以建立索引视图,这样就是在更新数据的时候比较费时,因为需要计算索引。在查询的时候直接从索引表中查出数据。

http://www.cnblogs.com/liuzhendong/archive/2011/10/10/2205744.html

收获园豆:11
dail | 园豆:630 (小虾三级) | 2012-04-11 09:37
0

先查询其中一个表的数据,再按照主键去关联其他的表

收获园豆:11
xutao888 | 园豆:254 (菜鸟二级) | 2012-04-11 15:55
0

用數據倉庫吧, 非常快。 像我們公司的決策分析系統, 數據量都是很大的, 維度有60多個, 運行起來非常快的。

邪见 | 园豆:204 (菜鸟二级) | 2013-03-07 16:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册