在ASP.NET页面上检索大型动态指定表的最佳策略

时间:2011-03-01 21:56:22

标签: linq devexpress sqldatasource aspxgridview xpo

寻找有关如何优化我们的项目的一些建议。我们有一个ASP.NET / C#系统,它从SQL2008数据中检索数据并将其呈现在DevExpress ASPxGridView上。检索到的数据可以来自多个数据库中的一个 - 所有数据库都略有不同,并且会定期添加和删除。向用户显示实时“公司”列表,并从相应的数据库中检索数据。

目前,正在使用标准SqlDataSource和动态创建的SQL SELECT语句检索数据。语句中有一些JOIN,以及可选的WHERE约束,再次根据数据库和用户的权限级别动态创建。

除了表演之外,所有这些都很棒(诚实!)。当涉及到一些数据库时,有几十万行,并且检索和分页数据非常慢(数据库已经被正确编入索引)。因此,我一直在寻找加快系统速度的方法,它似乎归结为两种选择:XPO或LINQ。

LINQ似乎是受欢迎的选择,但我不确定使用本质上如此动态的系统实现是多么容易 - 我是否需要为LINQ可以访问的每个数据库创建“定义”?我也对动态创建LINQ查询有点不确定,尽管看一些至少看起来可行的例子。

另一方面,XPO似乎允许我动态创建XPO数据源。但是,我找不到太多关于如何加入其他表的信息。

任何人都可以就哪种方法(如果有的话)最好尝试并改编成这个项目提供任何建议吗?或者,目前使用的动态SQL模型是否与LINQ和XPO根本不同,最好还是单独使用?

3 个答案:

答案 0 :(得分:2)

在您开始更改应用与数据库对话的整个方式之前,您是否看过以下内容:

  • 通过性能分析器(例如Redgate的性能分析器)运行代码,结果通常令人惊讶。

  • 如果您正在构建SQL字符串,是否使用.Net最佳实践,如String.Concat(“str1”,“str2”)而不是“str1”+“str2”。请记住,多个小收益会带来巨大收益。

  • 您是否考虑过定期更新汇总表或数据库(例如,每隔15分钟,您可能需要运行一项服务来自动更新此数据。)这样您才能访问一个数据库。与数据库的新连接非常昂贵。

  • 您是否查看了正在运行的SQL的查询计划。今天,我将一个动态创建的SQL字符串移动到一个sproc(只更改了1个param),并在运行时间内缩短了5-10秒(根据某些条件,它被称为100-10000次)。

如果您使用LINQ,请发出警告。我见过一些开发人员决定使用LINQ编写效率更低的代码,因为他们不知道自己在做什么(例如,当他们需要检查1时会拉出36,000条记录)。这件事很容易被忽视。

只是为了让你开始,希望有一些你没有想过的东西。

干杯,

斯图

答案 1 :(得分:2)

据我所知,当所有数据操作都在数据库服务器上完成而不是Web服务器并在那里处理它们时,你正在讨论所谓的server mode。在此模式下,网格可以非常快速地处理包含数十万条记录的数据源。如果要使用此模式,则应创建相应的LINQ类或XPO类。如果您决定使用LINQ based server mode,LINQServerModeDataSource会提供Selecting事件,该事件可用于设置自定义IQueryable和KeyExpression。我建议你在你的应用程序中使用LINQ。我希望,这些信息对您有所帮助。

答案 2 :(得分:0)

我想在这种情况下有两点可以调整性能。我假设您直接访问数据库而不是通过某种辅助层。

首先,您没有说明您是如何显示数据本身的。如果您将数千条记录加载到网格中,那么无论其他条件有多快,都需要时间。显然,这里的技巧是显示数据的子集并允许用户进行寻呼,等等。如果你没有这样做,那么这可能是一个很好的起点。

其次,您说表格已正确编入索引。如果是这种情况,并假设您没有一次将1,000条记录加载到页面中并且一次只回溯子集,那么您应该没问题。

但是,如果您只针对SQL连接执行ExecuteQuery()以获取数据集,我不会看到Linq或其他任何内容对您有何帮助。我会说问题显然在数据库方面。

因此,要解决数据库的问题,您需要分析正在运行的不同SELECT语句,检查查询计划并确定事情正在减慢的位置。您可能希望从使用SQL Server Profiler开始,但如果您有一个好的DBA,有时只需查看查询计划(您可以从Management Studio获得)通常就足够了。