如何提升LINQ的查询性能(上)

开发 后端
我们本篇文章不对谈了Linq系列技术是否好,是否改用,而是告诉那些将会或者已经使用了Linq技术的朋友,如何来提升Linq2Sql查询的性能。

自从Linq提出了之后,让很多的开发人员一阵的狂喜,编写代码似乎比以前更别的方便了,特别是随着Linq2Sql等推出来之后,开发人员感到了似乎手中有了强大的武器。同时,Linq2Sql带来的问题不断的出现,特别实在性能上面,这是让很多的多性能有着高要求的应用要放弃Linq2Sql系列技术的原因,并且很多回到了以前的ADO.NET技术,追求完全的控制。

 

系列文章:

如何提高Linq查询的性能(上)
如何提高Linq查询的性能(下)
 

这里和大家分享一些知识。我们本篇文章不对谈了Linq系列技术是否好,是否改用,而是告诉那些将会或者已经使用了Linq技术的朋友,如何来提升Linq2Sql查询的性能。

 

在本篇文章中,我们首先会介绍Linq2Sql查询是如何被执行的,然后我们介绍如何来编译Linq查询从而使得其性能提升。

本篇希望大家对Linq2Sql查询,特别是Linq2Sql的使用有一定的经验。

 

本篇的议题如下:

深入的查看Linq2Sql查询的工作原理(上)

如何编写编译的Linq查询(上)

性能比较(下)

结果分析(下)

 

深入的查看Linq2Sql查询的工作原理

 

首先我们来看看下面的一个简单的Linq查询,这个查询非常的简单,就是从一个Customer表中获取数据,这个Linq的查询被Linq的引擎转换为SQL语句,如下:

 

20120410110155.png

 

 

 

对于一个Linq查询,首先,需要检查它的语法,词法,***产生SQL语句。这个过程可以说是非常耗时的,并且对于每个Linq查询都要这样做。如果我们可以将每一个Linq查询的查询计划缓存的话,那么就快了。

 

其实这个原理和我们使用SQL Server一样:把SQL Server提交到数据库,首先执行词法语法分析,然后生成查询树,然后再交给查询优化器,生成执行计划,然后交给执行引擎去执行,***又存储引擎获取数据,并且生成的执行计划被缓存,以便重用,这样就极大的提升了性能,更多请看这里

 

在Linq技术中,提供了一种名为编译Linq查询的技术。在编译的Linq查询中,Linq生成的执行计划被缓存在一个静态的类中。我们知道,静态类是一个全局的公共资源,所以Linq查询可以去这个静态类中找到相应的执行计划,而不是每次都去解析,如下:

 

20120410110237.png

 

从上图中可以看到:从Linq的查询到***的执行解析成为SQL去执行,需要经历四个步骤,如果没有缓存Linq查询的执行计划,那么其实就是有5个步骤的,如下:

 

20120410110310.png

 

 

如何编写编译的Linq查询

 

既然已经知道了编译查询可以提升性能,那么我们就来看看具体的如何操作。

首先就要导入System.Data.Linq命名空间。

然后,为了避免一上来就丢上一大堆代码使得朋友们不舒服,我们就一点点的来进行:

    1. 首先定义一个静态的类:clsCompiledQuery
    2. 然后添加一个公共的静态方法指针变量,签名如下:

20120410110414.png

 

那么对于这个方法:

a. 这个方法的参数要首先接受一个DataContext对象

b. 这个方法可以随后接受一个或者多个输入参数,现在在我们的例子中,我们就接受了一个string类型的输入参数,因为我们的上面的customer的查询只是传入了一个txtCustomer.Text的值。

c. 我们需要定义类型为IQueryable的输出参数。

 

 

3. 定义好了方法指针的变量之后,我们就可以调用CompiledQuery类的方法Compiled,并且将DataContext与一个string作为输入参数,如下:

 

20120410110555.png

 

 

4. 整个方法指针的定义完整代码如下:

20120410110637.png

5.整个静态类的定义如下:

20120410110714.png

 

上面的准备工作做好了之后,我们就开始使用。可以在需要的地方进行如下的调用:

 

20120410110751.png

原文链接:http://www.cnblogs.com/yanyangtian/archive/2012/04/12/2443924.html

【编辑推荐】

  1. Linq to xml操作XML
  2. XML之父解读未来互联网"游戏化"的三个真谛
  3. Ajax和Web服务数据格式:XML SOAP HTML
  4. 超强解析XML——简单直接的来
  5. 解析PHP中的XML数据
责任编辑:彭凡 来源: 博客园
相关推荐

2017-03-13 09:50:00

HadoopHive

2023-05-25 20:06:17

Linux游戏性能

2009-09-17 09:11:26

LINQ查询

2011-11-30 21:59:41

ibmdwDojo

2009-09-17 09:45:36

LINQ查询语句

2021-12-02 07:02:16

API性能设计

2009-09-07 22:29:04

LINQ组合查询

2020-12-03 08:00:00

SQL数据库MySQL

2019-06-11 15:25:03

JSON性能前端

2023-12-14 12:56:00

MongoDB数据库优化

2009-09-14 18:53:27

LINQ查询

2009-09-14 18:41:59

LINQ查询

2009-09-16 17:33:16

LINQ TO SQL

2023-11-14 18:04:26

SQL语句性能

2024-01-02 18:01:12

SQLSELECT查询

2011-08-24 11:22:38

SQL ServerUNION代替OR

2014-04-01 09:52:46

MySQL

2023-05-22 14:19:48

索引Iceberg

2009-09-15 10:35:11

linq多表查询

2009-09-17 17:03:13

LINQ动态查询
点赞
收藏

51CTO技术栈公众号