目前所在的项目大量使用了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. 4. COLLATION_CHARACTER_SET_APPLICABILITY

    4. COLLATION_CHARACTER_SET_APPLICABILITY 表COLLATION_CHARACTER_SET_APPLICABILITY表示哪种字符集适用于哪种排序规则. INF ...

  2. mysql启动问题

    /usr/local/mysql/bin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13 - Permission denied) - ...

  3. hadoop上传文件报错

    19/06/06 16:09:26 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad ...

  4. Java基础学习之数组基本属性和方法

    数组对于每一门编程语言都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同.Java语言中提供的数组是用来存储固定大小的同类型元素.你可以声明一个数组变量,如 int[100] 来代替直接 ...

  5. 解决Can’t finish GitHub sharing process Successfully created project ‘GitHubDemo’ on GitHub

    Can't finish GitHub sharing process        Successfully created project 'KeyWordsFrameWork' on GitHu ...

  6. Codeforces Round #269 (Div. 2)-D. MUH and Cube Walls,KMP裸模板拿走!

    D. MUH and Cube Walls 说实话,这题看懂题意后秒出思路,和顺波说了一下是KMP,后来过了一会确定了思路他开始写我中途接了个电话,回来kaungbin模板一板子上去直接A了. 题意: ...

  7. 【转】关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)

    本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...

  8. git clone, push, pull, fetch 的用法

    Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Gi ...

  9. CSUOJ 1256 天朝的单行道

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1256 题目大意:     在另一个平行宇宙中,有一个神奇的国度名叫天朝.天朝一共有N个城 ...

  10. idea web项目启动失败的情况---webapp文件夹路径不对,应如图位置