几百万条数据怎么优化速度?? 3秒一个SQL语句的速度
要弄一个报表程序, 只查不写, 几百万数据怎么3秒内能统计出数据?(3秒左右最好 尽量不超过10秒),
每次查出来的数据不大也就1000~2000条, 不过基本都需要全表统计, 各种sum 各种group by 各种order by 各种full join。。。 服务器就一般常见的几万块机子
我现在的思路是在这些大表根据业务情况建立一些汇总表, 比如统计地区销量就: 地区,商品大类, 业务日期,销量, 金额这样, 大概就10w多条, 这样我在这10w多条记录里sum啊group by啊order by啊都比较快,10秒内基本就出来了, 不过有些纠结的是有几个报表是要统计大区里的店铺数, 商品大类里有几个款。。。 尼玛这不是很好搞了
另外就是最科学的建索引、优化查询语句了, 现在主表的主键是订单号varchar(30),
我换成int会快多少? 日期加索引, 店号加索引 , 明细表的索引就2个, 一个订单 一个款号 没设主键。 索引还有什么优化的地方?
另外一个想法是换oracle, 不知道能快多少? 如果从10秒快到8秒也没意思, 能从10秒到3秒就换。。
我的库情况是这样, 600w的表有3张, 200w的表有10来张, 30w的表有20来张, 这些都是盘点啊销售啊什么的业务表, 都是主从结构, 比如
销售主表: 订单号(varchar 30 主键), 业务日期(只有天不带小时,每天2000条), 单据类型(3,4个类型,经常会做where条件), 店铺表(distinct 1000多条)
销售明细表: 订单号(varchar 30 主键) 商品款号(distinct 8000条), 颜色(distinct 1w条, 很少统计查询到)、 尺码(distinct 20来条, 很少统计查询到)、 数量、 金额
基础数据表大概20个, 最大最常用的商品档案表8000条, 店铺表1000来条, 其他很多都是小表, 大部分基础数据表都是商品档案的扩展属性, 比如商品大类表, 商品小类表, 商品风格表等,这些都100条以下
------- 大家
------解决方案--------------------全表的话索引效率都不高,建议定期汇总保存,查询的时候直接关联汇总表
------解决方案--------------------像这种记流水的数据最好是定期封存,不然会越来越慢。
譬如销售流水,这个需要定期封存的,查的时候去查历史数据就好了。
------解决方案--------------------LZ可以考虑用视图索引(Indexed View),毫秒级的查询速度.
参考 http://www.codeproject.com/Articles/199058/SQL-Server-Indexed-Views-Speed-Up-Your-Select-Quer
------解决方案--------------------换了oracle 又能快多少?呵呵,你说的内容已经把你的问题都说出来了,改变处理方式吧,楼上的都说到了
------解决方案--------------------如果希望通过索引来加快速度,而你基本上又都是全表的数据都要查,那么可以考虑建覆盖索引,因为你一个表几十个字段,你不可能在报表中都需要查询,肯定是查询少了的几个字段。
如果访问的字段比较多,那么就考虑做个日结表,或者月结表,每天晚上计算好了存进去,后面直接从里面查询就可以,不用在sum和group by,说白了就是预先把结果存进去,方便以后反复的查询。
另外,在sql server中,索引视图不建议使用,基本上就是摆设,一堆的限制条件。
------解决方案--------------------查询语句只要够优化的话,效率也会高很多的。
一般来说,在查询的时候尽量去过滤条件。用临时表这些来取得临时结果集,然后再在这个基础上进行查询比较好。
报表统计都可以这样。
------解决方案--------------------
我们现在就是这样搞的,把经常用到的信息提前汇总好,全表扫描索