linq to sql 系列之 linq to sql性能优化技巧
2010-05-21 09:32
603 查看
linq to sql 是一个代码生成器和ORM工具,他自动为我们做了很多事情,这很容易让我们对他的性能产生怀疑。但是也有几个测试证明显示在做好优化的情况下,linq to sql的性能可以提升到ado.net datareader性能的93%。
因此我总结了linq to sql的10个性能提升点,来优化其查询和修改的性能。
1. 不需要时要关闭 DataContext的ObjectTrackingEnabled 属性
func变量现在是一个已经编译后的查询,他只需要在第一次运行时编译一次,就可以重复使用,现在我们将其存储到一个静态类中,如下所示:
4. 使用DataLoadOptions.AssociateWith设置仅从数据库中取需要的数据
请参考:/article/4672620.html
5. 仅在需要时打开积极并发控制,换句话说如果不需要请将列的UpdateCheck属性设置为UpdateCheck.Never,这样在更新和删除时可以减少不必要的条件判断
7. 仅在有必要时使用Attach方法。
在linq to sql中对象附加是一个的非常好用的机制,但是什么事情都不是免费的。当在DataContext中Attach对象时,就意味着过一段时间你会使用这个对象,DataContext会给这个对象做“马上要做修改的”标记。
但是有时候Attach并非必要,例如使用AttachAll去附加一个集合,这个集合中的元素并非都会发生变化。
8. 注意实体标识管理的开销
在一个非只读的DataContext中,对象一直会被跟踪,因此要知道在非直觉的情况下也可能会导致DataContext做对象跟踪,请看下面的代码
这两种写法哪一种更快呢,事实证明第二个语句比第一个要快得多http://blogs.msdn.com/ricom/archive/2007/06/29/dlinq-linq-to-sql-performance-part-3.aspx
为什么呢? 因为在第一个查询中查询出的每一个对象都需要存储在DataContext中,并对他们做可能会发生变化的跟踪,而在第二个查询中你生命了一个新的对象,就不需要再做跟踪了,所以第二个语句效率会高一些。
9. Linq to sql 提供了Take和Skip方法,使用他们来取需要的记录,不要把整个表中的记录都取下来
10. 不要滥用CompiledQuery 方法,如果你确认某个查询只会执行一遍,那就不要使用CompiledQuery来了,使用它也是需要付出代价的。
最后希望这些技巧对你有用。欢迎发表评论。
本文是翻译文章;
原文请看 http://www.sidarok.com/web/blog/content/2008/05/02/10-tips-to-improve-your-linq-to-sql-application-performance.html
linq to sql相关随笔:
1. 从CUD开始,如何使用LINQ to SQL插入、修改、删除数据
2. 查询 使用LINQ to SQL做简单查询
3. 查询 延迟加载与立即加载,使用LoadWith和AssociateWith
4. 查询 inner join,left outer join
5. Linq to SQL中的聚合grouping having
6. LINQ to SQL查询优化,需要忧虑性能吗?
因此我总结了linq to sql的10个性能提升点,来优化其查询和修改的性能。
1. 不需要时要关闭 DataContext的ObjectTrackingEnabled 属性
Func<NorthwindDataContext, IEnumerable<Category>> func = CompiledQuery.Compile<NorthwindDataContext, IEnumerable<Category>> ((NorthwindDataContext context) => context.Categories. Where<Category>(cat => cat.Products.Count > 5));
func变量现在是一个已经编译后的查询,他只需要在第一次运行时编译一次,就可以重复使用,现在我们将其存储到一个静态类中,如下所示:
using (NorthwindDataContext context = new NorthwindDataContext()) { QueriesUtility.GetCategoriesWithMoreThanFiveProducts(context); }
4. 使用DataLoadOptions.AssociateWith设置仅从数据库中取需要的数据
请参考:/article/4672620.html
5. 仅在需要时打开积极并发控制,换句话说如果不需要请将列的UpdateCheck属性设置为UpdateCheck.Never,这样在更新和删除时可以减少不必要的条件判断
/article/4672616.html 这篇文章中的第三点。 6. 经常设置DataContext.Log查看linq to sql执行时使用的sql,分析取回的数据是否刚好够用。 using (NorthwindDataContext context = new NorthwindDataContext()) { context.Log = Console.Out; }
7. 仅在有必要时使用Attach方法。
在linq to sql中对象附加是一个的非常好用的机制,但是什么事情都不是免费的。当在DataContext中Attach对象时,就意味着过一段时间你会使用这个对象,DataContext会给这个对象做“马上要做修改的”标记。
但是有时候Attach并非必要,例如使用AttachAll去附加一个集合,这个集合中的元素并非都会发生变化。
8. 注意实体标识管理的开销
在一个非只读的DataContext中,对象一直会被跟踪,因此要知道在非直觉的情况下也可能会导致DataContext做对象跟踪,请看下面的代码
using (NorthwindDataContext context = new NorthwindDataContext()) { var a = from c in context.Categories select new Category { CategoryID = c.CategoryID, CategoryName = c.CategoryName, Description = c.Description }; }
这两种写法哪一种更快呢,事实证明第二个语句比第一个要快得多http://blogs.msdn.com/ricom/archive/2007/06/29/dlinq-linq-to-sql-performance-part-3.aspx
为什么呢? 因为在第一个查询中查询出的每一个对象都需要存储在DataContext中,并对他们做可能会发生变化的跟踪,而在第二个查询中你生命了一个新的对象,就不需要再做跟踪了,所以第二个语句效率会高一些。
9. Linq to sql 提供了Take和Skip方法,使用他们来取需要的记录,不要把整个表中的记录都取下来
10. 不要滥用CompiledQuery 方法,如果你确认某个查询只会执行一遍,那就不要使用CompiledQuery来了,使用它也是需要付出代价的。
最后希望这些技巧对你有用。欢迎发表评论。
本文是翻译文章;
原文请看 http://www.sidarok.com/web/blog/content/2008/05/02/10-tips-to-improve-your-linq-to-sql-application-performance.html
linq to sql相关随笔:
1. 从CUD开始,如何使用LINQ to SQL插入、修改、删除数据
2. 查询 使用LINQ to SQL做简单查询
3. 查询 延迟加载与立即加载,使用LoadWith和AssociateWith
4. 查询 inner join,left outer join
5. Linq to SQL中的聚合grouping having
6. LINQ to SQL查询优化,需要忧虑性能吗?
相关文章推荐
- linq to sql 系列之 linq to sql性能优化技巧
- linq to sql 系列之 linq to sql性能优化技巧
- linq to sql 系列之 linq to sql性能优化技巧
- linq to sql 系列之 linq to sql性能优化技巧
- LINQ to Sql系列四 性能优化总结
- 也记一次性能优化:LINQ to SQL中Contains方法的优化
- Linq-to-SQL性能优化提升实践
- inq to sql性能优化技巧
- ADO.net,Linq to SQL和Entity Framework性能实测分析
- Linq to Sql 学习系列之八 继承与关系
- sql server08 查询优化系列 3-1 sql 查询性能分析 sql profiler
- 一步一步学Linq to sql系列文章
- PLSQL_性能优化工具系列01_PXHCDR.SQL: Parallel Execution Health-Checks and Diagnostics(待整理)
- Oracle SQL性能优化系列学习一
- Oracle SQL性能优化系列学习一
- Oracle SQL性能优化技巧大总结
- SQL优化技巧--远程连接对象引起的CTE性能问题
- Oracle SQL 性能优化技巧
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
- SQLSERVER SQL性能优化技巧