SQL 大数据量优化,牛人进(主要讨论思路)。

一只眼足矣看码 2012-09-24 06:39:59
SQLService 数据库
有一个表,每天插入的数据量大概是百万级,10天能有两千万的数据,这个数据量每天都按照这个级别增长,不会删除数据。里面常用的 字段是: 用户ID、手机型号、手机操作系统版本、登陆日期、来源IP、登陆程序(QQ、微信等)、来源渠道(UC浏览器、91助手等)、来源子渠道。大概这些字段。
目前有2个需求:
1:按照时间或者某个字段查询 (现在已经在常查询的字段建了 非聚集索引)
2:按照统计查询:比如统计 UC浏览器 QQ 的登陆次数 (目前是这个需求,个人认为 后续会增加 UC浏览器+手机型号+QQ 的登陆次数 等)

根据这2个需求,目前想到2点,1把数据每个月导到另一张表,只能让他查询1个月内的数据以及统计,但是被PASS掉了。
2准备单独创建一张表,每天统计一次,把可能会出现的几个常用字段,都放在统计表 比如 来源渠道、登陆程序、登陆次数、用户ID、手机型号。 这样的话 SQL不必在海量数据里面去运算,根据时间查询统计表就能得到结果。但是缺点是 扩展性有局限,如果改变查询方式,就需要改变统计表。

哪位牛人还有更好的方法。感谢
...全文
460 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
DBA_磊仔 2012-09-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用楼主 的回复:
SQLService 数据库
有一个表,每天插入的数据量大概是百万级,10天能有两千万的数据,这个数据量每天都按照这个级别增长,不会删除数据。里面常用的 字段是: 用户ID、手机型号、手机操作系统版本、登陆日期、来源IP、登陆程序(QQ、微信等)、来源渠道(UC浏览器、91助手等)、来源子渠道。大概这些字段。
目前有2个需求:
1:按照时间或者某个字段查询 (现在已经在……
[/Quote]建议你就是使用索引视图

CREATE VIEW dbo.Invoice_D_ViewSum WITH SCHEMABINDING
AS
Select DType as Type, DocSigNo as ShipSigNo, IndentID, ChartID,
Sum(Amt) as Amt,
/*注意这里,在插入数据的时候就已经自动汇总了,你查询时只是读取这个已经完成了的汇总表*/ count_big(*) as cnt
from dbo.Invoice_D
Group by DType, DocSigNo, IndentID, ChartID

GO

CREATE UNIQUE CLUSTERED INDEX idx_Type ON dbo.Invoice_D_ViewSum(Type,ShipSigNo,IndentID,ChartID );
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
SQLService 数据库
有一个表,每天插入的数据量大概是百万级,10天能有两千万的数据,这个数据量每天都按照这个级别增长,不会删除数据。里面常用的 字段是: 用户ID、手机型号、手机操作系统版本、登陆日期、来源IP、登陆程序(QQ、微信等)、来源渠道(UC浏览器、91助手等)、来源子渠道。大概这些字段。
目前有2个需求:
1:按照时间或者某个字段查询 (现在已经在……
[/Quote]

他们想要实时查询,只能查一个月 他们觉得不行,如果用分区的话,就只能查询1个月内的了
汤姆克鲁斯 2012-09-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:
引用楼主 的回复:
SQLService 数据库
有一个表,每天插入的数据量大概是百万级,10天能有两千万的数据,这个数据量每天都按照这个级别增长,不会删除数据。里面常用的 字段是: 用户ID、手机型号、手机操作系统版本、登陆日期、来源IP、登陆程序(QQ、微信等)、来源渠道(UC浏览器、91助手等)、来源子渠道。大概这些字段。
目前有2个需求:
1:按照时间……
[/Quote]
同意,因为你的须有比较固定也有限,索引视图才是最佳选择。
gongjian0628 2012-09-25
  • 打赏
  • 举报
回复
帖子 顶起来!
mohong_lin 2012-09-24
  • 打赏
  • 举报
回复
对于插入很频繁的数据表,应考虑分表,一般可分为:历史数据表和当前数据表,当前数据表,按你的需求,可以只存当天的入库的数据,并将用作业将数据定时写到历史数据表中。接下来你可以对历史表建相对复杂而且适用于查询索引(这并不用考虑频繁插入而导致索引性能低下),而当前表,你只需要做简单的索引,以满足频繁的写入就好!而由于当前表数据量不多,查询性能也跟得上!
WYhack 2012-09-24
  • 打赏
  • 举报
回复

“根据这2个需求,目前想到2点,1把数据每个月导到另一张表,只能让他查询1个月内的数据以及统计,但是被PASS掉了。”

我不知道为什么被pass掉了?

分区应该可以解决这个问题,分区的话,具体多少数据一个区,还得测试,貌似千万级数据一下不用分区
一切以数据说话,不能妄下结论

不过分区还需慎重,这方面没有做过系统全面的测试,不敢轻易下结论,
其实回头想想分区能提高性能的原理是什么?不还是B树索引的结构决定的嘛,在一定数据量范围内,B树的层是不变的,那么在这个范围内,分区就没有意义。

另外聚集非聚集索引的选择很重要,需要根据情况而定

参考
http://topic.csdn.net/u/20120912/16/4817b0cb-255a-4c08-b8d4-367e2952c2ce.html
KevinLiu 2012-09-24
  • 打赏
  • 举报
回复
第一个问题可以使用Partition功能,安装时间分区,将不同的FILE放入不同的磁盘(提高IO性能)
第二个如果不是实时查询的话可以考虑晚上做一个ETL计算汇总数据放入汇总表。
DBA_磊仔 2012-09-24
  • 打赏
  • 举报
回复
这个数量级,什么索引都是假的,用索引视图吧
發糞塗牆 2012-09-24
  • 打赏
  • 举报
回复
1、建议使用2005以上的库。
2、做分区,这里的分区是2005以后的新特性,类似你每个月导到一个表,但是其实是一个表。
3、对日期列,你要查询的那个字段,做复合聚集索引。经常出现在where和on中的字段加非聚集索引。

对于统计数量,这个比较复杂,因为太动态了,容易导致表结构的频繁改动,所以我不建议在统计列上做聚集索引

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧