2010-11-10 24 views
2

我已经被赋予将三个遗留系​​统合并到一个用户界面的任务。这将是一个Asp.Net Mvc应用程序。如何获得最佳性能访问多个不同的数据库

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

对于每个访问这个新接口的用户,都需要查询所有这些数据库。 Sql Server数据库和Powerflex数据库之一拥有数百万条记录。

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

链接Sql Server数据库并为这些服务器写入一个包含连接的查询吗?

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

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

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

我从来没有尝试过将这么多后端结合在一起,而我关注性能。至少四次往返都会对我表现不佳,甚至没有写出一行代码。任何提示将不胜感激。 PS:将它们全部集中到一个数据库中是不可能的。

回答

0

所有你在你的问题建议的东西有简化你的代码,使之更具可读性,或更容易保持良好的潜力。但是,它们都不会以任何方式影响性能,仅仅因为您仍然有4个不同的物理数据连接(甚至从SQL 2005到2008的链接服务器定义,反之亦然)。

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

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

如果你可以做到这两件事情,那么最终只有两个物理数据连接可以担心(SQL 2008和Powerflex)。然后,您可以根据具体情况手动优化数据访问。例如,如果要连接来自两个数据连接的结果集,请首先执行可能返回最少行数的结果集,然后使用其结果缩小另一个查询的搜索条件。

+0

访问数据库无法移动,因为其中一个传统应用程序使用消息排队并将数据写入此数据库以达到合规目的。它的讨厌和现在,不可改变。 – 2010-11-10 22:04:53

0

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

建立更新来自不同系统的数据进出的协议(数据需要传输的频率,数据以及操作方式)。

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

0

是下列选项:

  1. 移动的SQL Server 2005实例到SQL Server 2008的计算机(仍然在它自己的数据库,甚至可能运行如果有必要的SQL Server 2005的版本。)
  2. 将Access数据库导入SQL Server 2008机器到它自己的数据库中。 如果仍然需要通过访问进行更新,则可以从Access中引用。

这会给你两个主要的数据位置(带有3个SQL Server数据库)和Powerflex数据库。

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

+0

您也可以使用ODBC驱动程序让SQL2k8实例执行链接服务器。现在,您可以通过相同的连接连接所有4个DB。 – Bengie 2010-11-10 20:56:38

0

有几种方法可以做到这一点我的头顶。

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

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

而且,我认为你是对的。如果你不能把它们组合成一个单独的数据库,真的没有办法解决糟糕的性能问题。

EF可能是你最好的选择。

0

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

+0

这是问题之一,我应该提到它。其中两个数据库对实时数据有要求。这是新界面的原因之一。 – 2010-11-11 01:19:51

0

根据您拥有的工作量/查询结构,您可以选择多种方式。

如果您对多个数据库有长时间运行的查询,那么使用BeginInvoke()/ EndInvoke()等可用的异步类型可能有意义。

如果您必须接收来自多个数据库的许多记录,并且传输延迟成为问题,则可以将数据接收交给工作线程,然后再将结果合并。

如果结果集太大以至于无法将它们保存在内存中,请考虑使用流式方法。服务器端排序和“合并”类型的算法可以在这里帮助很大。例如,连接将按连接键进行排序,并且匹配的元组将自动成为从两个流中首先发送的。

如果您有更多和更大的集合要加入,您可以先查询较小的集合并使用数据在较大的数据库上进行过滤。

一如既往,请记住,遇到意外的工作负载和数据分布时,手动硬编码优化会以最糟糕的方式破坏。

相关问题