目前所在的项目大量使用了linq,结果有个地方出现了严重的性能问题。一个统计需要3、40秒。头头焦头烂额之际,也让我看看。

我向来喜欢性能调优,自诩编码极为注重性能。曾几何时,也动不动就把性能挂在嘴边。总之,我貌似是一个性能砖家。

不过,对于这条linq,我阴沟翻船,搞不定。一来我半路杀入,不了解情况;二来我看不懂那些linq。

我想到的切入点,是监控数据库运行的sql,看看问题出在哪里。

数据库是oracle的。如果是sql server,有图形化的界面profile侍候,但oracle的话,plsql工具有个SQL 跟踪,但好像变灰了,用不了。可以查询视图V$SQL。

用sys登录,运行如下语句:

select sql_text,sql_fulltext,cpu_time,elapsed_time,first_load_time,last_load_time,last_active_time
from v$sql
where last_active_time is not null
and module='w3wp.exe' --来自于IIS
and service='ORCL' --指定数据库实例名称
order by last_active_time desc --按时间倒序排

视图V$SQL字段极多,涉及到时间的有好几个。first_load_time,last_load_time这些不宜用来考察运行的时间点。因为看上去这里面涉及到缓存。一条SQL语句,如果没有变化,那么一次加载,可以重复使用很久。

我运行了这条查询语句,可以看到所有的SQL。问题是,调试那个linq,却看不到有啥SQL出现。真奇怪啊。

后来头头自己搞定了。原因是参与这条linq运算的对象是一个IEnumable<>,改成IQueryable<>就可以了。估计是IEnumable<>对象的话,系统会自动ToList(),将数据获取到内存里,然后参与运算;而IQueryable<>的话,则最后编译成sql到数据库运行,这时过滤条件什么的会起作用,速度当然快了。这也是为何那条LINQ不见有SQL产生的原因。

但是,IQueryable 是继承 IEnumable 的。这听上去有点诧异。

那条linq语句为啥这么慢的更多相关文章

  1. [转]在Entity Framework中使用LINQ语句分页

    本文转自:http://diaosbook.com/Post/2012/9/21/linq-paging-in-entity-framework 我们知道,内存分页效率很低.并且,如果是WebForm ...

  2. Linq语句基础

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. sql执行万条update语句优化

    几个月没有更新笔记了,最近遇到一个坑爹的问题,顺道记录一下.. 需求是这样的:一次性修改上万条数据库. 项目是用MVC+linq的. 本来想着用 直接where() 1 var latentCusto ...

  4. 使用linq语句进行联表查询

    假设你有一个父表(例如:汽车),其关联一个子表,例如轮子(一对多).现在你想对于所有的父表汽车,遍历所有汽车,然后打印出来所有轮子的信息.默认的做法将是: SELECT CarId FROM Cars ...

  5. 一条Sql语句分组排序并且限制显示的数据条数

    如果我想得到这样一个结果集:分组排序,并且每组限定记录集的数量,用一条SQL语句能办到吗? 比如说,我想找出学生期末考试中,每科的前3名,并按成绩排序,只用一条SQL语句,该怎么写? 表[TScore ...

  6. LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别

    LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别 在写LINQ语句的时候,往往会看到.AsEnumerable() 和 .AsQueryable() .例如: s ...

  7. 动态拼接linq 使用Expression构造动态linq语句

    最近在做动态构造linq语句,从网上找了很多,大多数,都是基于一张表中的某一个字段,这样的结果,从网上可以搜到很多.但如果有外键表,需要动态构造外键表中的字段,那么问题来了,学挖掘机哪家强?哦,不是, ...

  8. JavaWeb 学习009-4个页面,5条sql语句(添加、查看、修改、删除)

    ===========++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++==+++++++++ 2016-12-3------ ...

  9. JavaWeb 学习007-4个页面,5条sql语句(添加、查看、修改、删除)2016-12-2

    需要复习的知识: 关联查询 =================================================================================班级模块学 ...

随机推荐

  1. webpack之source map

    先来一个webpack小例子,项目结构如下: // greeter.js module.exports = function() { var greet = document.createElemen ...

  2. CSS3---渲染属性

    1.计数器 CSS3计数器( CSS Counters )可以允许我们使用css对页面中的任意元素进行计数,实现类似于有序列表的功能.与有序列表相比,它的突出特性在于可以对任意元素计数,同时实现个性化 ...

  3. 「问题思考」python的递归中return返回none

    代码: #求最大公约数 def gcd(x,y): if x < y: swap = x x = y y = swap if x%y == 0: return y else: gcd(y,x%y ...

  4. jquery validate基本

    http://www.runoob.com/jquery/jquery-plugin-validate.html jquery validate 默认 在键盘按下并释放及提交后验证提交表单 例如: $ ...

  5. 【HIHOCODER 1037】 数字三角形

    链接 问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋彼岸的美国.美国人民的生活非常有意思,经常会有形形色色.奇奇怪怪的活动举办,这不,小Hi和小Ho刚 ...

  6. DEVExpress中BarItem的使用2

    没有验证LookUpEdit与ComBox的区别. 没有验证ZoomTrackBarControl的使用方法. SparkLine看着也蛮有趣,需要绑定数据源控件的均没有验证. 前一节介绍的BarIt ...

  7. tarjan 学习记

    1.强连通分量是什么 强连通分量指的是部分点的集合如果能够互相到达(例如 1→3,3→2,2→1(有向图)这种,132每个点都能互相抵达) 或者说,有一个环,环上点的集合就是一个强连通分量 2.那怎么 ...

  8. 【01】Firebug 教程

    Firebug 教程 什么是 Firebug? Firebug 是一个开源的web开发工具.   现在浏览器自带firebug了.     安装 Firebug Firebug下载地址: https: ...

  9. POJ 3177 边双连通求连通量度的问题

    这道题的总体思路就是找到连通量让它能够看作一个集合,然后找这个集合的度,度数为1的连通量为k,那么需要添加(k+1)/2条边才可以保证边双连通 这里因为一个连通量中low[]大小是相同的,所以我们用a ...

  10. Foundation框架的一些实用方法:替换字符串,去空格,反转

    //定义一个可变字符串, Format后面可以跟字符串类型,也可以传入C语言的字符串数组 NSMutableString *str = [NSMutableString stringWithForma ...