方法 - 优化LINQ以提高性能

时间:2011-02-03 05:43:27

标签: sql-server linq linq-to-sql silverlight-4.0

我的问题分为几个部分,可能会很长时间,很抱歉。

我正在使用LINQ将数据传递给Silverlight客户端。

第1部分:连接池&优化: 我想知道如何确保LINQ只建立一个与数据库的连接,并遵循连接池。过去,我曾经将连接池属性放在SQL连接字符串本身中。所以,如果我把这个设置文件,当我在DBML文件中添加表时设置连接字符串的地方,LINQ会尊重它 LINQ(DBML)构成了我的数据访问层的核心。我编写的类具有基本上是LINQ查询的方法。 我在代码中的“using”块中使用DataContext对象,我处理数据相关的部分。 这是LINQ可能使用多个连接的原因吗?如果我将DataContext作为类级变量,那么这只能确保一个连接吗?

第2部分:优化 在不久的将来,ADO.Net时代,我曾经编写存储过程,通过DataReader执行它,然后遍历DataReader,填充我的Model类的多个对象,并传递该集合以绑定到DataGrid。 在LINQ时代,我或多或少地创建了一个对象集合。但是我自己执行直接的LINQ语句。 我可以猜测SQL存储过程会给我更快的性能,但是如果我使用LINQ执行存储过程,它会像过去一样快,是否是正确的方法?

1 个答案:

答案 0 :(得分:7)

噢......这么多坏习惯。

  

第2部分:优化不是那么遥远   过去,ADO.Net天,我曾经写过   存储过程,通过执行它   DataReader然后循环遍历   DataReader,填充我的多个对象   模型类并传递给它   用于绑定到DataGrid的集合。在   LINQ天,我或多或少都一样   远远创建一个对象集合   被关注到。但我直接执行   LINQ语句本身。我能猜到   那个SQL存储过程会给出   我的表现更快,但是

基本上,过去你有一些轻微的妄想。存储过程现在已经超过10年没有(!)性能提升。它在文档中清楚地说明了。 SQL执行速度与非存储过程一样快,查询计划被缓存并重用于两者。

如果SP避免往返(即从客户端向服务器发送多批请求),那么SP只会很好(如:节省时间)。然后节省的不是因为它们是传统的程序,而是由于往返旅行需要时间。

遗憾的是,许多程序员仍然有妄想,因为他们是从其他人那里得到的...... 10年前,当存储过程具有内在优势时。现在这是SQL Server 6.5时间 - 从7.0开始这是历史。

http://weblogs.asp.net/fbouma/archive/2003/11/18/38178.aspx

基本上你处理了丢失的开发时间和许多无用的代码......最可能没有可衡量的优势。

  

第1部分:连接池&   优化:我想知道我该怎么做   确保LINQ只建立一个   连接到数据库,也遵循   连接池。

你不这样做。基本上不要试图变得更聪明而不是对你有好处。多个连接有什么问题?如果他们感觉到了什么?

对于池,yu应该(sql server)不必在连接字符串中正常放置任何内容。是的,LINQ不会神奇地绕过连接字符串中定义的连接池。请参阅,LINQ没有与数据库交谈 - 它使用ADO.NET,而ADO.NET并没有神奇地改变行为,因为一些更高级别的ORM正在使用它而不是你。连接字符串具有池条目,ADO.NET仍然可以看到它们并跟随它们。

现在,从服务器池只有一个数据库连接是一回事:STUPID。它一次限制一个事务,一旦负载变高就完全破坏性能(即需要同时处理多个请求)。

  

我在中使用DataContext对象   在我的代码中“使用”块   处理数据相关部分。这是   LINQ可能正在使用的原因   多重连接?如果我有   DataContext作为类级变量,   这会确保只有一个连接吗?

啊 - 取决于。它可能有意义,它可能没有。你知道,在你认为你遇到问题之前,特别是考虑到你在这里提供的信息量很大(即没有),做一件唯一明智的事情:抓住一个分析器并测量你是否有一个。打开/关闭连接100次或1000次最有可能甚至不会出现在探查器上。没有问题=无理由修复。

那就是说,我不喜欢每个方法连接开放 - 它通常显示一个糟糕的类设计。连接应该在一个工作单元中重用。