2009-02-11 44 views
4

我們正在使用SQL服務器數據庫在.net 3.5中構建一個新的應用程序。數據庫相當龐大,大約有60個表格,其中有數據加載。 .net應用程序具有將數據從數據輸入和第三方系統導入數據庫的功能。存儲過程中的複雜處理與.NET應用程序

在數據庫中所有數據都可用後,系統必須進行大量計算。計算邏輯非常複雜。所有計算所需的數據都在數據庫中,輸出也需要存儲在數據庫中。數據收集將每週進行一次,並且需要每週進行一次計算以生成所需的報告。

由於上述情況,我正在考慮使用存儲過程進行所有這些計算。問題是我們還需要數據獨立性,而存儲過程將無法爲我們提供這一點。但是,如果我一直在查詢數據庫中通過.net完成所有這些工作,我認爲它不會很快完成工作。

例如,我需要查詢一個表,它將返回2000行,然後爲每行我需要查詢另一個表,這將返回我300結果比我需要查詢多個表的每行(約10 )來獲得所需的數據,進行計算並將輸出存儲在另一個表中。

現在我的問題是我應該繼續使用存儲過程解決方案,並忘記數據庫的獨立性,因爲性能很重要。如果我們使用存儲過程解決方案,我也認爲開發時間會少得多。如果有客戶想要說這個解決方案說oracle數據庫(因爲他們不想維護另一個數據庫),那麼我們將存儲過程移植到oracle數據庫,併爲以後的任何更改/增強保留兩個版本。同樣,其他客戶可能會要求其他數據庫。


上面提到的2000行是產品skus。我提到的300行具有我們想要計算的不同屬性,例如,處理成本,運輸成本等。我提到的10個表格包含貨幣轉換,單位轉換,網絡,面積,公司,銷售價格,每天銷售數量等信息。結果表格將所有信息存儲爲星形模式分析和報告的目的。我們的目標是獲得有關產品的任何詳細信息,以便了解產品銷售的哪些屬性會使我們花錢,以及我們可以在哪些方面進行改進。

回答

3

我不會考慮在數據庫以外的任何地方進行數據操作。

大多數人嘗試使用循環算法處理數據庫數據。如果您需要真正的速度,請將您的數據視爲一組行,並且您可以在單個更新中更新數千行。我已經將新手程序員編寫的這麼多光標循環改寫爲單個更新語句,其中執行時間大大提高。

你說:

我需要查詢一個表,該表將 還給我那麼2000行的每一行 我需要查詢其他表, 將返回我300個結果比 的每一行這一點,我需要查詢 多個表(約10),以從你的問題得到 所需的數據

它看起來像您不使用連接,而你已經在考慮循環。即使你打算循環,最好編寫一個查詢來加入必要的所有數據,然後遍歷它。記住更新和插入語句可能會導致大量複雜的查詢。包括CASE語句,派生表,條件連接(LEFT OUTER JOIN),您可以在單個更新/插入中解決任何問題。

+0

我並不是在尋找目前的執行方式,我給出的信息只是爲了給出我想要實現的任務的想法。當我們開始實施時,我會記住你的建議。目前我想知道是否使用存儲過程或在.net應用程序中提取信息。 – 2009-02-12 03:58:42

3

沒有關於這些表中的數據的任何具體細節,只是餐巾紙計算的後面顯示您正在討論在您提供的示例中處理超過600萬行信息(2,000行* 300行*(1行* 10表))。

所有這些行是不同的,還是10個表的查找信息具有相對較低的基數?換句話說,是否有可能將程序從內存中的10個查找表中獲取信息,然後在內存中處理300行結果集以執行計算?另外,我會擔心可伸縮性 - 如果你在存儲過程中這樣做,它將保證是一個受單個數據庫服務器速度限制的串行進程。如果您有可能創建多個客戶端程序副本,每個客戶端程序都處理2000個初始記錄集的一部分,那麼您可以並行執行一些計算,這可能會加快您的總體處理時間,並使其可以隨時擴展你的初始記錄集大10倍。

+0

所有行都不相同,因此內存中的查找表沒有任何幫助。我確實想過在塊中進行並行處理,但最終數據庫事務的數量是相同的,所以我認爲我不會得到任何好處。 – 2009-02-11 08:21:53

1

像計算代碼一樣編程的東西在C#中更容易和更易維護。另外,由於數據庫最難擴展,因此通常將SQL Server上的處理降到最低是一種很好的做法。

話雖如此,從您的描述中,聽起來像存儲過程的方法是要走的路。當計算代碼依賴於大量數據時,將數據從服務器移出計算將會更加昂貴。所以,除非你有合理的方法來優化相關數據(比如緩存查找表?),那麼你很可能會發現它更加痛苦,那麼不值得使用存儲過程。

1

每次都存儲過程,但正如KM在那些存儲過程中所說的那樣,這些迭代將最小化,即在SQL中使用連接,關係數據庫非常適合連接。

數據庫可擴展性將是一個小問題,尤其是因爲它聽起來像你會在批處理過程中執行這些計算。

除了最瑣碎的CRUD應用程序之外,數據庫獨立性並不存在,所以如果您最初的要求是讓這一切都與SQL Server協同工作,那麼您可以利用RDBMS提供的工具(畢竟您的客戶端已經花費了它上面有很多錢)。如果(後來的客戶端真的不想使用SQL Server)(並且它很大),那麼您必須咬緊牙關,並在另一種存儲過程中進行編碼。但是,正如你所識別的那樣:「如果我一直在查詢數據庫中完成所有這些工作,我認爲它不會很快完成工作。」你已經承擔了這樣做的費用,直到需要時爲止。

0

我會考慮在SQL Server Integration Services(SSIS)中執行此操作。我將計算放入SSIS中,但將查詢留作存儲過程。這將爲您提供數據庫獨立性 - SSIS可以通過ODBC連接處理來自任何數據庫的數據 - 以及高性能。只有簡單的SELECT語句存在於存儲過程中,並且這些是SQL標準中最有可能在多個數據庫產品中相同的部分(假設您堅持標準形式的查詢)。

相關問題