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点 一样,但优化只通过一次查询出完整数据;

        /// <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 > 0 ? 0 : -1;
            var maxPageIndex = (int)Math.Floor((double)total / pageSize) + inc;
            pageIndex = Math.Max(0, 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;
        }

  

  

原文地址:https://www.cnblogs.com/intotf/p/11150214.html

时间: 2024-11-29 09:13:06

linq 大数据 sql 查询及分页优化的相关文章

大数据表查询或者分页

单表 select a.id from a where type=1 order by id foreach 组合成 (20,3,69)形式 select a.title,a.id from a in(组合形式) id 铸件索引 type普通索引 多表 select a.cid,b,id from a inner join b on a.cid=b.id foreach 组合成(20,3,69)形式 select * from c where sid in (组合形式) c 为a 和b表组合 i

Oracle大数据SQL语句优化

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描, 如: select id from t where num is null    可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则

30个MySQL千万级大数据SQL查询优化技巧详解

本文总结了30个mysql千万级大数据SQL查询优化技巧,特别适合大数据里的MYSQL使用. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t wher

impala大数据量查询/tmp/impala-scratch创建异常

使用impala做大数据量查询distinct的时候报如下错误 WARNINGS: Create file /tmp/impala-scratch/24414dab2c19caca:e54b206c5ab149d_24414dab2c19caca:e54b206c5ab149f_91001337-9d70-4c93-84ce-e7916c1ae804 failed with errno=2 description=Error(2): No such file or directory Backe

sql大数据量查询的优化技巧

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from xuehi.com where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from xuehi.com where num=0 3.应尽量避免在 where 子句中使用

提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)

转自http://blog.163.com/zhangjie_0303/blog/static/9908270620146951355834/ 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然

[转]提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用

大数据量数据库设计与优化方案(SQL优化)

转自:http://blog.sina.com.cn/s/blog_6c0541d50102wxen.html 一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性

.Net中EF针对大数据量查询超时的一种优化

旧代码: --receiptIds   id集合,每次查1000左右 var mappingList = new List<FinanceSettlementMapping>(); mappingList.AddRange(SettlementMappingRepository.Entities.Include(o => o.ReceiptsTo).Include(d => d.FinanceSettlement).Where(d => receiptIds.Contains