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或不确定列的条件。
这样的数据量应该不算海量,合理的视图索引应该可以解决,必要的时候用空间换时间也是可以的
建议重新分析需求,把count,sum的统计信息放到一张表中,定时更新这些统计数据。另外为什么视图中的数据要来自6张表呢,建议看下是否可以适当添加冗余字段,避免这么多的视图查询。
把统计结果COUNT,SUM放在表中,不要每次都重复计算。
数据量过大时,需要考虑数据库结构设计。不能采用单一表设计,也不能唯一依靠索引。
可以试一下千万数据一个表的查询速度。主键、索引、普通列的分别速度。
sqlserver2008 千万级的数据量应该可以应付把,
可以尝试建立视图索引,可以在类似的学习科目上建立位图索引(如果只是OLAP)
分析需求,重构数据库设计;空间换时间,根据业务需要提前汇总数据并缓存数据;千万级数据量还算不上海量。
这种数据分析类的,当然要用OLAP了,,研究一下数据仓库吧,
否则你的问题解决不了,
数据应该不算海量,具体问题要具体分析,普适原则还是可以说说的,表的索引中,应该要设计主键,要充分利用聚集索引,Where 条件多没关系的,只要有个别条件能够利用上聚集索引就很好了。另外避免过多的Join, 避免过于复杂的Sql语句,就是把一条过于复杂的语句分割成多条比较简单的语句。另外不要创建临时表了吧,就是(5)不要分两步,直接一步好了。因为你只是Sum(), Count()什么的。另外Sql Server的配置上有个索引所用的内存适当加大。Sql Server服务器的硬件内存配置也要加大。
可以建立索引视图,这样就是在更新数据的时候比较费时,因为需要计算索引。在查询的时候直接从索引表中查出数据。
http://www.cnblogs.com/liuzhendong/archive/2011/10/10/2205744.html
先查询其中一个表的数据,再按照主键去关联其他的表
用數據倉庫吧, 非常快。 像我們公司的決策分析系統, 數據量都是很大的, 維度有60多個, 運行起來非常快的。