SqlServer 大量数据热汇总优化整理
来源:互联网 发布:论大数据的十大局限 编辑:程序博客网 时间:2024/06/05 10:23
一、大量数据热汇总查询优化
查询性能提升方式:
1.为汇总查询列创建非聚集索引,索引很大的方面提升查询性能
2.尽量避免分组汇总,解决方法将分组汇总改成多次查询
3.使用多线程或者或者说多任务,对汇总查询性能并没有提升。
二、操作示例,测试数据基数20万
1.分组查询代码
public IEnumerable getSummaryTotalDataSourceByCode(out int total, int _start, int pageSize){ var query = DB.Fin_Info.Where(a => a.IsSettlement == true) .GroupBy(a => new { a.MemberId, a.MemberCode, a.NickName }) .Select(a => new { a.Key.MemberCode, a.Key.MemberId, a.Key.NickName, 报单费 = a.Where(p => p.TypeName == "报单费").Sum(p => p.Amount), 见点奖 = a.Where(p => p.TypeName == "见点奖").Sum(p => p.Amount), 推荐奖 = a.Where(p => p.TypeName == "推荐奖").Sum(p => p.Amount), 层奖 = a.Where(p => p.TypeName == "层奖").Sum(p => p.Amount), 对碰奖 = a.Where(p => p.TypeName == "对碰奖").Sum(p => p.Amount), 团队奖 = a.Where(p => p.TypeName == "团队奖").Sum(p => p.Amount), 级差奖 = a.Where(p => p.TypeName == "级差奖").Sum(p => p.Amount), 全球奖 = a.Where(p => p.TypeName == "全球奖").Sum(p => p.Amount), 小计 = a.Sum(p => p.Amount), 手续费 = a.Sum(p => p.Poundage), 实际金额 = a.Sum(p => p.RealAmount) }); var data = query.OrderByDescending(a => a.MemberCode).Skip(_start).Take(pageSize).ToList(); total = data.Count; if (data.Count >= pageSize) { total = query.Count(); } return data;}测试结果:
//按会员统计分页/* * 创建MemberID索引前 创建MemberID索引后 * 调试状态:执行时间大约5秒左右 大约4秒多 * 非调试状态:3秒多 大约3秒多 */Stopwatch watch = new Stopwatch();watch.Start();//获取分页数据int total = 0;IEnumerable list = DB.Fin_Info.getSummaryTotalDataSourceByCode(out total, 0, 10);Console.WriteLine(list.ToJsonLongDate());watch.Stop();Console.WriteLine($"总共执行秒数:{watch.Elapsed.TotalSeconds}");
2.优化处理代码:
public IEnumerable getByCode(out int total, int _start, int pageSize){ //1.会员表获取会员分页 List<Member_Info> memberList = null; var memberQuery = DB.Member_Info.Where(); memberQuery = memberQuery.Where(q => q.IsActive == "已激活"); //分页 total = memberQuery.Count(); memberList = memberQuery.OrderByDescending(q => q.CreateTime) .Skip(_start) .Take(pageSize) .ToList(); //2.汇总会员的奖金 List<object> list = new List<object>(); var query = DB.Fin_Info.Where(); query = query.Where(q => q.IsSettlement == true); foreach (var item in memberList) { var a = query.Where(q => q.MemberId == item.MemberId); list.Add(new { MemberCode = item.Code, MemberId = item.MemberId, NickName = item.NickName, 报单费 = a.Where(p => p.TypeName == "报单费").Sum(p => p.Amount), 见点奖 = a.Where(p => p.TypeName == "见点奖").Sum(p => p.Amount), 推荐奖 = a.Where(p => p.TypeName == "推荐奖").Sum(p => p.Amount), 层奖 = a.Where(p => p.TypeName == "层奖").Sum(p => p.Amount), 对碰奖 = a.Where(p => p.TypeName == "对碰奖").Sum(p => p.Amount), 团队奖 = a.Where(p => p.TypeName == "团队奖").Sum(p => p.Amount), 级差奖 = a.Where(p => p.TypeName == "级差奖").Sum(p => p.Amount), 全球奖 = a.Where(p => p.TypeName == "全球奖").Sum(p => p.Amount), 小计 = a.Sum(p => p.Amount), 手续费 = a.Sum(p => p.Poundage), 实际金额 = a.Sum(p => p.RealAmount) }); } return list;}测试结果
//按会员统计分页/* 创建MemberID索引前 创建MemberID索引后 * 调试状态:4秒多 大约2秒多 * 非调试状态:2秒左右 大约0.4秒 */Stopwatch watch = new Stopwatch();watch.Start();//获取分页数据int total = 0;IEnumerable list = DB.Fin_Info.getByCode(out total, 0, 10);Console.WriteLine(list.ToJsonLongDate());watch.Stop();Console.WriteLine($"总共执行秒数:{watch.Elapsed.TotalSeconds}");
三、其他实例 ,包含按日期汇总查询
更多:
EF Attatch()方法附加对象
EF批量操作数据之EntityFramework.Extended
EF 汇总函数使用注意事项Max()/Min()等
阅读全文
0 0
- SqlServer 大量数据热汇总优化整理
- 48、Power Query-大量复杂数据的整理汇总
- SQL数据库大量数据查询优化思考点汇总
- sqlserver 一次性删除大量数据
- sqlserver导入大量数据步骤
- SQLServer大量数据高效率分页
- SQLServer优化资料整理
- SQLServer优化资料整理
- SQLServer优化资料整理
- 大量数据优化常用方法
- 大量数据优化常用方法
- Mysql大量数据存储优化
- sql 大量数据查询的 优化措施
- SQL大量数据查询的优化
- SQL大量数据查询的优化
- SQL大量数据查询的优化
- sqlite大量数据插入的优化
- sqlite大量数据插入优化总结
- 验证数字的正则表达式集(转载)
- Java中在特定区间产生随机数 (2009-03-26 13:31:49)转载▼ 标签: 杂谈 生成指定范围内的随机数 这个是最常用的技术之一。程序员希望通过随机数的方式来处理众多的业务逻辑,测试
- 在ubuntu14.04下安装和配置shadowsockets以及安装和配置chromium
- hdu1071-The area 积分求解与x轴形成的面积
- bzoj 1037: [ZJOI2008]生日聚会Party
- SqlServer 大量数据热汇总优化整理
- 前端学习笔记3-1 javascript
- WebJars 记录
- (1) spring去掉默认绑定的common-logging.jar
- Chrome Extension实战:页面JS脚本替换
- Java网络编程(二)-基于http协议的网络编程
- php7那点事
- centos7 iptables 命令
- 1006 最长公共子序列Lcs