linq 大数据 sql 查询及分页优化
前提:
需要nuget PredicateLib 0.0.5;
SqlServer 2008R2 (建议安装 64 位);
.net 4.5 或以上;
当前电脑配置: I7 4核 3.6GHZ,8G 内存 (办公电脑 ,win10 64位)
描述:
在实际项目中我们会遇到多个表关联查询数据,并进行分页操作;当数据量很大的时候如(500万或以上)的时候,分页很吃力,特别还需要一些模糊查询,排序的时候会导致很慢;
本文章主要解决分页及多个数据表关系查询速度慢的问题:
解决办法及优化过程:
1、通常我们对 数据库的优化莫过于索引,储存过程等;
2、能使用一条Sql 语句查询的话,不要使用多条语句(学习使用 linq 语法);
3、尽量少使用 in ('.....') 多个值;经测试超过 5万个 in 的时候会提示内存不足异常;
4、order 的使用很是奇葩,原本用 order Id(主键),反而查询非常慢,而且 Cpu 使用一下子 100%,换成别的字段就完全没压力;(暂时无法理解,在出现问题后可尝试改变 order)
5、尽量 select 少的字段,在实际中遇到 分页的时候,先 select 出 Id,然后在通过 Id 去查询完整数据,会比直接查询完整要快 N 倍;
如通过两条语句查询出大数据的时候:var ids = select top 10 Id from ViewTable;
var datas = select * from ViewTable where Id in (ids);
结合表示式生成分页查询扩展(完美优化):
非常实用的硬代码,在大数据分页的时候性能优越:
主要原理跟上面 第 5点 一样,但优化只通过一次查询出完整数据;
缺点: 每页的数据量建议不要太大,比如:每页1万
/// <summary>
/// 执行分页
/// 性能比较好
/// </summary>
/// <typeparam name="T">实体类型<peparam>
/// <param name="source">数据源</param>
/// <param name="orderBy">排序字符串</param>
/// <param name="pageIndex">分页索引</param>
/// <param name="pageSize">分页大小</param>
/// <param name="idSelector">Id选择器</param>
/// <returns></returns>
public static async Task<PageInfo<T>> ToPageAsync<T, TId>(this IQueryable<T> source, string orderBy, int pageIndex, int pageSize, Expression<Func<T, TId>> idSelector)
where T : class
where TId : class
{
source = source.Where(Predicate.Create(idSelector, null, Operator.NotEqual));
int total = await source.CountAsync();
var inc = total % pageSize > ? : -;
var maxPageIndex = (int)Math.Floor((double)total / pageSize) + inc;
pageIndex = Math.Max(, Math.Min(pageIndex, maxPageIndex)); var idQuery = source.OrderBy(orderBy).Skip(pageIndex * pageSize).Take(pageSize).Select(idSelector);
var datas = await source.Join(idQuery, idSelector, item => item, (item, id) => item).OrderBy(orderBy).ToArrayAsync(); var page = new PageInfo<T>(total, datas) { PageIndex = pageIndex, PageSize = pageSize };
return page;
}
linq 大数据 sql 查询及分页优化的更多相关文章
- 深入MySQL(四):MySQL的SQL查询语句性能优化概述
关于SQL查询语句的优化,有一些一般的优化步骤,本节就介绍一下通用的优化步骤. 一条查询语句是如何执行的 首先,我们如果要明白一条查询语句所运行的过程,这样我们才能针对过程去进行优化. 参考我之前画的 ...
- mysql大数据量下的分页
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...
- 《深度访谈:华为开源数据格式 CarbonData 项目,实现大数据即席查询秒级响应》
深度访谈:华为开源数据格式 CarbonData 项目,实现大数据即席查询秒级响应 Tina 阅读数:146012016 年 7 月 13 日 19:00 华为宣布开源了 CarbonData ...
- 如何提高sql查询性能到达优化程序的目的
1.关于SQL查询效率,100w数据 SQL查询效率 step by step -- setp 1.-- 建表create table t_userinfo(userid int identity(1 ...
- 大数据量查询容易OOM?试试MySQL流式查询
一.前言 程序访问 MySQL 数据库时,当查询出来的数据量特别大时,数据库驱动把加载到的数据全部加载到内存里,就有可能会导致内存溢出(OOM). 其实在 MySQL 数据库中提供了流式查询,允许把符 ...
- offset新探索:双管齐下,加速大数据量查询
摘要:随着offset的增加,查询的时长也会越来越长.当offset达到百万级别的时候查询时长通常是业务所不能容忍的. 本文分享自华为云社区<offset新探索:双管齐下,加速大数据量查询> ...
- 【大数据之数据仓库】GreenPlum优化器对比测试
在< [大数据之数据仓库]选型流水记>一文中有提及,当时没有测试GreenPlum的quicklz压缩算法和ORCA查询优化器,考虑到quicklz压缩算法因为版权问题不会开源(详情请参阅 ...
- Impala简介PB级大数据实时查询分析引擎
1.Impala简介 • Cloudera公司推出,提供对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能. • 基于Hive使用内存计算,兼顾数据仓库.具有实时.批处理.多并发等优点 ...
- 开发一个不需要重写成Hive QL的大数据SQL引擎
摘要:开发一款能支持标准数据库SQL的大数据仓库引擎,让那些在Oracle上运行良好的SQL可以直接运行在Hadoop上,而不需要重写成Hive QL. 本文分享自华为云社区< ...
随机推荐
- rxJava2.x源码解析
一. Rxjava是什么 Rxjava在GitHub的介绍是 "A library for composing asynchronous and event-based programs u ...
- 基础面试,为什么面试官总喜欢问String?
关于 Java String,这是面试的基础,但是还有很多童鞋不能说清楚,所以本文将简单而又透彻的说明一下那个让你迷惑的 String 在 Java 中,我们有两种方式创建一个字符串 String x ...
- Eclipse导入SpringBoot项目pom.xml第一行报错Unknown error
1.网上搜的都说是将SpringBoot2.1.5版本降级到SpringBoot2.1.4版本,感觉这治标不治本啊,以后想升级不是玩完了. 错误如下所示: 参考:https://ask.csdn.ne ...
- 2018-8-10-win10-uwp-关联文件
原文:2018-8-10-win10-uwp-关联文件 title author date CreateTime categories win10 uwp 关联文件 lindexi 2018-08-1 ...
- css文本超出部分用省略号表示
以前我在面试中遇到过这个问题,当时没答上来,现在回答一下: 1.设置三个属性: overflow:hidden (超出部分隐藏) white-space:nowrap (强制不换行) tex ...
- Oracle有哪些诊断事件
作者:eygle | [转载请注出处]链接:https://www.eygle.com/archives/2004/12/oracle_diagnostics_events_list.html 经常有 ...
- Ubuntu18.04安装Cuda10.1
注:如果使用anaconda,貌似不需要手动安装Cuda和cudnn,安装tensorflow时会自动安装 1.官方教程https://docs.nvidia.com/cuda/cuda-instal ...
- PLSQL Developer数据库连接和tnsname.ora的配置
1.将资源解压,打开解压完成目录中的PLSQL Developer文件夹,双击plsqldev.exe图标打开PLSQL Developer. 打开help>>about中找到TNS Fi ...
- golang数据结构和算法之LinkedList链表
差不多自己看懂了,可以自己写测试了.:) LinkedList.go package LinkedList //"fmt" type Node struct { data int ...
- 智能指针类模板(上)——STL中的智能指针
智能指针类模板智能指针本质上就是一个对象,它可以像原生指针那样来使用. 智能指针的意义-现代C++开发库中最重要的类模板之一-C++中自动内存管理的主要手段-能够在很大程度上避开内存相关的问题 1.内 ...