目前所在的项目大量使用了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. configparser ,subprocess , xlrd ,xlwt 模块

    一,configparser模块 ''' configparser模块: 是什么: 用于解析配置文件的模块 配置文件的定义: 用于编写保存某个软件或某个系统的一系列参数的文件 设置参数 为什么需要配置 ...

  2. [SHELL]awk的用法举例

    从初学awk到现在小有所成,非常感谢CUers的帮助,总结了下自己曾经遇到的问题和犯的错误,供初学者借鉴,因本人非计算机专业,对专业词汇可能有表述不对的地方,还请指正和补充! 1. awk '{cod ...

  3. robotframework使用requestsLibrary进行接口测试

    一.定义 接口测试:接口测试通常是系统之间交互的接口,或者某个系统对外提供的一些接口服务 分类:RESTful.webservice接口 二.安装 进入C:\Pyhon27\scripts 先要安装r ...

  4. laravel groupby分组问题。

    laravel 5.7使用groupBy分组查询时会提示一个错误,但是sql可以执行. 因为:mysql从5.7以后,默认开启了严格模式. 解决方法:将/config/database.php 中:关 ...

  5. UITableView点击背景

    系统自定义的点击背景有时间觉得效果不好想换个 - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelect ...

  6. CSU1030素数槽

    Description 处于相邻的两个素数p和p + n之间的n - 1个连续的合数所组成的序列我们将其称为长度为n的素数槽.例如,‹24, 25, 26, 27, 28›是处于素数23和素数29之间 ...

  7. 间谍网络(tarjan缩点)

    洛谷传送门 看着这道题给人感觉就是tarjan求SCC,然而还得判断是否能控制全部间谍,这就得先从可以贿赂的点dfs一遍. 如果没有全部被标记了,就输出NO,再从没被标记的点里找最小的标号. 如果全被 ...

  8. 洛谷P1757 通天之分组背包

    题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大 ...

  9. hdu 2181暴搜

    #include<stdio.h> #include<string.h> #define N 30 int map[N][4],total; void dfs(int n,in ...

  10. SQL Server 创建唯一约束sql语句

    SQL Server 创建唯一约束sql语句   语句示例:   在创建表是时同时创建, 创建id,name,sex三个字段的唯一索引 create table t1( id int primary ...