1

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

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

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

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

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

任何人都可以就哪种方法(如果有的话)最好地尝试和改造到这个项目中提供任何建议吗?还是当前使用的动态 SQL 模型与 LINQ 和 XPO 根本不同,最好不要管它?

4

3 回答 3

2

在你去改变你的应用程序与数据库对话的整个方式之前,你有没有看过以下内容:

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

  • 如果您正在动态构建 SQL 字符串,您是否使用 .Net 最佳实践,例如 String.Concat("str1", "str2") 而不是 "str1" + "str2"。请记住,多个小收益加起来就是大收益。

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

  • 您是否查看过正在运行的 SQL 的查询计划。今天,我将动态创建的 SQL 字符串移动到存储过程中(仅更改了 1 个参数),并将运行时间缩短了 5-10 秒(根据某些条件,它被调用了 100-10000 次)。

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

只是一些让你开始的东西,希望那里有你没有想到的东西。

干杯,

斯图

于 2011-03-01T22:14:32.143 回答
2

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

于 2011-03-02T00:28:50.117 回答
0

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

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

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

但是,如果您只是ExecuteQuery()针对 SQL 连接来获取数据集,我看不出 Linq 或其他任何东西会如何帮助您。我会说问题显然出在数据库方面。

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

于 2011-03-01T22:23:58.837 回答