2

我的问题是使用 LINQ for SQL 优化性能的最佳实践是什么,而性能是用户界面中的响应超时。

现在我在 SQL Server 2008 数据库中有一些销售数据,我在使用 LINQ 的 ASP.NET 应用程序中的图表中显示这些数据(MAT,每年,在不同的细分市场,细分市场的增长,市场增长的百分比)用于 SQL 构造执行的 Iquerable 表达式

我看到了我有一个数据库并使用 LINQ 构建所有问题的挑战,我无法控制创建了什么 SQL(我可以跟踪它,但是,,,,),我不使用存储过程,所以我的数据是如何获取的就像一个黑匣子。

现在我运行一些单元测试并手动测试应用程序并使用数据库引擎优化顾问创建什么索引等......

4

2 回答 2

2

除此之外,我通常会在大型数据集上对一些模拟用户同时使用 SQL 分析器和 CLR 分析器,并通过数据上下文观察长时间运行的查询和/或长时间运行的调用(这可能表示多个来回发生在幕后)。我个人的偏好也是默认禁用所有数据上下文的延迟加载和对象跟踪,因此在大多数情况下我必须选择加入多次往返。虽然您不能直接影响生成的 SQL,但您可以小心使用 LoadWith/AssociateWith 并确保您没有获取非常大/低效的结果集,并分解具有大量昂贵连接的查询(有时是多轮-trips 比大桌子上的 mondo joins 便宜)。

一切都是关于测量的——使用任何你能得到的工具。

于 2009-12-30T03:22:37.530 回答
1

剖析,剖析,剖析。:)

不仅要测量时序,还要注意 I/O。由于缓存,频繁执行的 I/O 密集型查询可以快速执行,但反过来会对整体 db-server 性能产生负面影响,因为其他查询可用的资源会更少。

正如您所说,L2S 可能有点像一个黑匣子,因此您需要在真实用户使用应用程序时尝试复制所有场景和/或配置文件。然后使用它来 1) 调整查询 2) 添加索引 3) 进行任何其他所需的更改以获得所需的性能。

我有一个专门为 Linq-to-SQL 制作的分析工具,使它有点“更少的黑匣子”——它允许您在将生成的查询绑定到导致特定查询的代码(调用堆栈)时进行运行时分析被执行。您可以在http://www.huagati.com/L2SProfiler/下载并获得免费试用许可证

此处更详细地概述了我的分析器的背景原因:http: //huagati.blogspot.com/2009/06/profiling-linq-to-sql-applications.html

...这里介绍了一些高级分析选项:http: //huagati.blogspot.com/2009/08/walkthrough-of-newest-filters-and.html


如果您有很多包含很多列的表,另一件可能会有所帮助的事情是将索引信息获取到代码编辑器中。这是通过将带有该信息的 xml 文档注释添加到实体类和成员属性来完成的;然后该信息会显示在 VS 代码编辑器的工具提示中:

显示 L2S 实体类、成员属性等的 xml 文档注释的代码编辑器工具提示

...这样你就可以在输入查​​询时看到是否有索引覆盖 where 子句等中使用的列。为了避免输入所有这些,我也为此创建了一个工具。请参阅http://www.huagati.com/dbmltools/中的“更新文档”功能

于 2009-12-30T03:38:02.443 回答