2011-06-10 31 views
1

我目前正在爲存儲在MSSQL數據庫中的數據製作報告工具。 該數據庫是巨大的,因爲它是一個生產數據庫,我不是它的所有者,我不能擴展任何功能(添加表/函數等)。計算報告數據 - C#通過集合或SQLite

爲了得到我的報告編號,我需要使用昂貴的查詢(遊標),同時我不想對數據庫造成不必要的壓力。這也是相當複雜的東西,如分析庫存移動和用法,而不僅僅是簡單的總和和計數。

所以我目前的做法是使用單個查詢以小塊加載數據,將它們加載到集合中,然後運行幾個foreach迭代來計算報告的數據。 基本上我正在重建內存中的數據庫,然後我計算。

我目前在那裏有相當多的代碼(和DB中的實體對象),我開始認爲這可能是一個更好的解決方案,通過通過創建必要數據的本地簡化副本例如一個單獨的SQLLite-DB。

我也考慮linq的對象,但基本上我仍然需要創建和填充對象... 而數據庫甚至可以給新的報表創建新的查詢,而不是硬編碼他們的能力。 在另一方面,它可能會慢於做所有類別...

所以,問題(最終):那你覺得,那會是更好的 手動複製的簡化和縮小版數據到本地數據庫,或者你會與其他解決方案?

+0

問題:您能否提供更多關於「巨大」的含義的信息?你實際需要查詢多少個表/記錄?什麼是源數據庫?它是否在與您正在編寫的應用程序代碼不同的機器上運行?您是否有證據表明運行數據庫的服務器無法承受報告的性能影響?你是否100%確定你需要做的事情不能在沒有遊標的情況下完成? – 2011-06-10 16:35:37

+0

我問,因爲根據我的經驗,報告輸出很少需要光標。如果構建正確,SQL查詢可能非常強大,而RDBMS優化器幾乎總是能夠更有效地利用CPU週期,而不是自己複製數據並進行處理。 – 2011-06-10 16:37:25

+0

按照這個想法,如果您必須從RDBMS中卸載數據,並且數據量確實很大,那麼我建議您使用本地數據庫,而不是嘗試自己管理存儲。 – 2011-06-10 16:38:54

回答

2

如果您的查詢真的很貴,那麼您最好的選擇是將它們加載到本地數據庫並在那裏進行處理。我建議使用SQL Server Express Edition,因爲您可以利用t-sql (link)。至於加載數據,您可以使用您的查詢,BCP,DTS包或約50個其他選項。

2

通常可以接受您的Prod數據庫快照,並將它們複製到另一個可以在其上執行報告查詢的數據庫。這樣你就不會爲Prod DB增加更多的負載。有幾種方法可以做到這一點。硬件級複製(通常速度最快),軟件級別複製(可能很昂貴),使用視圖,預定作業,這些作業將使用來自Prod的實時數據填充本地數據庫。根據您的數據模型,一些報告分析將花費幾分鐘到幾小時,因爲連接和數據量很大。因此建議在單獨的非生產數據庫上完成報告。