2010-11-10 43 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()等可用的異步類型可能有意義。

如果您必須接收來自多個數據庫的許多記錄,並且傳輸延遲成爲問題,則可以將數據接收交給工作線程,然後再將結果合併。

如果結果集太大以至於無法將它們保存在內存中,請考慮使用流式方法。服務器端排序和「合併」類型的算法可以在這裏幫助很大。例如,連接將按連接鍵進行排序,並且匹配的元組將自動成爲從兩個流中首先發送的。

如果您有更多和更大的集合要加入,您可以先查詢較小的集合並使用數據在較大的數據庫上進行過濾。

一如既往,請記住,遇到意外的工作負載和數據分佈時,手動硬編碼優化會以最糟糕的方式破壞。

相關問題