如何获得访问多个不同数据库的最佳性能

时间:2010-11-10 19:40:18

标签: c# .net database performance

我被赋予了将三个遗留系​​统整合到一个用户界面中的任务。这将是一个Asp.Net Mvc应用程序。

我在一台服务器上有一个Sql Server 2005实例,在另一台服务器上有一个Sql Server 2008实例,一个访问数据库,用于保存合规性数据并通过自定义插件填充,以及一个通过odbc访问的Powerflex数据文件数据库。

对于访问此新界面的每个用户,都需要查询所有这些数据库。其中一个Sql Server数据库和Powerflex数据库有数百万条记录。

我的问题是处理这种情况的最有效方法是什么?

我是否链接Sql Server数据库并使用这些服务器的连接编写单个查询?

我是否在内存数据集中使用断开连接?

我是否对数据读取器使用简约查询?

我是否尝试使用实体框架(我没有查看Powerflex数据库的连接器)?

我从来没有试图将这么多的后端聚集在一起,我担心表现。至少有四次往返旅行,在没有写一行代码的情况下,对我来说表现不佳。任何提示将不胜感激。

PS:此时将它们全部整合到一个数据库中是不可能的。

7 个答案:

答案 0 :(得分:0)

如果可能的话,将所有需要的数据导入到另一个数据库中,该数据库由您控制。

建立更新来自不同系统的数据的协议(数据需要传输的频率,数据和方式)。

您将获得对您的应用程序数据的控制权,并且无​​需担心其他多个数据库(只要导入/导出正常工作),管理许多数据源以及需要在您的应用程序中管理它们之间的数据一致性。

答案 1 :(得分:0)

以下是一个选项:

  1. 将SQL Server 2005实例移动到SQL Server 2008计算机上(仍在其自己的数据库中,如果需要,甚至可能运行SQL Server 2005版本。)
  2. 将Access数据库导入SQL Server 2008计算机,并将其导入到自己的数据库中。    如果仍需要通过访问权限更新,您可以从Access引用它。
  3. 然后,这将为您提供两个主要数据位置(具有3个SQL Server数据库)和Powerflex数据库。

    在SQL Server数据库之间使用连接(不需要链接到其他服务器,因此应该相对高性能),然后将Powerflex中的数据合并到一个中间层。

答案 2 :(得分:0)

有几种方法可以做到这一点。

一,使用DataSet。您可以将来自所有不同数据库的信息查询到一个DataSet中,然后从该数据集中进行查询。

二,使用Entity Framework获取所有这些模型,并使用LINQ查询不同的实体。

而且,我认为你是对的。如果你不能将它们组合到一个数据库中,那么就无法解决性能不佳的问题。

EF可能是你最好的选择。

答案 3 :(得分:0)

您是否考虑过使用Microsoft的企业库?您可以透明地查询所有这些数据库。它实现了Factory模式;根据所访问的特定数据库加载和使用正确版本的数据库驱动程序。

这是链接:

http://msdn.microsoft.com/en-us/library/ff648951.aspx

答案 4 :(得分:0)

您在问题中建议的所有内容都有可能简化代码,使其更具可读性或更易于维护。但是,它们都不会以任何方式影响性能,原因很简单,因为您仍然会有4种不同的物理数据连接(即使是从SQL 2005到2008的链接服务器定义,反之亦然也无济于事。)

要获得任何真正的性能优势,您必须尝试以某种方式合并数据。例如:

  • 将SQL 2005数据库移动到与SQL 2008数据库相同的物理SQL Server实例上。然后,您可以在表之间编写跨数据库连接,而不是跨链接服务器连接,这将更有效。
  • Access数据库是否以该格式保存,因为Access表单或报告正在使用它?如果是这样,您可以使用升迁向导将表移动到SQL Server,但在MDB文件中保持Access表单和报表不变。

如果您可以同时执行这两项操作,则最终只需要担心两个物理数据连接(SQL 2008和Powerflex)。然后,您可以根据具体情况手动优化数据访问。例如,如果要从两个数据连接中加入结果集,请执行可能首先返回最少行数的结果集,然后使用其结果来缩小其他查询的搜索条件。

答案 5 :(得分:0)

我有一个类似的项目,有许多sql服务器通过局域网(不同的版本),该应用程序的目的是查看和很少编辑数据。我确实为每个服务器编写了一个Windows服务,该服务每小时使用应用服务器上的WCF服务导出/同步数据。存储库是SQL Server 2008,位于该实体框架之上。如果您的应用不需要即时访问实时数据,则此解决方案可以执行此操作。

答案 6 :(得分:0)

根据您的工作负载/查询结构,有几个选项可供您使用。

如果您在多个数据库上有长时间运行的查询,那么使用某种异步(如BeginInvoke()/ EndInvoke()可能是有意义的。

如果您必须从多个数据库接收许多记录并且传输延迟成为问题,您可以将数据接收传递给工作线程并在之后合并结果。

如果结果集太大而无法在内存中保存它们,请考虑使用流式处理方法。服务器端排序和“合并”类型算法在这里可以提供很大帮助。例如,连接将按连接键排序,匹配的元组将自动从两个流中传输。

如果要加入较小和较大的集合,可以先查询较小的集合,然后使用数据过滤较大的数据库。

与往常一样,请记住,当遇到意外的工作负载和数据分布时,手动硬编码优化会以最糟糕的方式中断。