2014-02-14 46 views
0

我有4個SQL查詢可以獲取相當數量的數據,其中2個數據分別需要大約30秒和60秒。將大量數據加載到WPF數據網格中

我打算緩存大量的數據,以便在初始加載後也不會花那麼長......

但是初始加載仍然會佔用大量的時間,所以我只是想知道從SQL Server中將這4個數據表提取並加載到4個單獨的WPF數據網格中的最佳方式是什麼?

我不認爲有很多從SQL查詢本身獲得性能明智。他們是非常直接的選擇,但瓶頸是另一個網絡上的鏈接服務器上的JOIN

它只是一個異步運行每個查詢並加載它們的問題,還是有更好的方法?

+0

應用程序將多久加載一次/有多少用戶?數據庫上的某些東西是否值得維護一個緩存本身,這樣你就可以獲得可能幾分鐘之前的非瓶頸數據? –

+0

@HighCore我猜你沒有看到這個問題...... – user1021726

+0

@CraigGraham截至目前只有10人左右,但它可能會在白天被加載多次,只要需要它(這是一個小型獨立應用程序,簡化了很多東西的)。 – user1021726

回答

1

正式化它;您的瓶頸在後端設計中,與前端應用程序無關。更改後端設計,以便每次啓動應用程序實例時,您的應用程序不再需要服務器之間的連接。這可能是一個簡單的可執行文件,在數據庫服務器上定期運行,並維護一個緩存表,您的前端可以一次性檢索緩存表,或者它可以是應用程序通過訪問數據庫的完整服務。

此外,由於數據只是每24小時更新一次,並且仍然可能是一個可移動的大塊,因此每個最終用戶機器上都保留一個本地高速緩存,如果該最終用戶機器比最後一箇中央版本數據。

+0

其他人已經給出了很好的答案,但是您的問題是解決數據庫瓶頸的問題。保存緩存表並異步地將數據加載到用戶界面中的組合將是最好的方法,也許Dean K建議。 – user1021726

1

在可以運行查詢非同步
這可能是最有效的方法

你們中許多人想看看優先結合
PriorityBinding

另一種選擇是使用一個BackgroundWorker檢索的get數據表在背景中。
BackgroundWorker
至於4個DataTables,你有幾個選擇。
你可以立即將它們全部解僱。
或者您可以在事先完成的事件中開啓下一個。

1

使用任務並行庫,當你調用從數據庫中獲取的數據和操作由TPL創建一個單獨的線程中執行的方法...

using System.Threading.Tasks; 
... 
Task.Factory.StartNew(() => GetLotsOfRecordsFromDB()). 
      ContinueWith(t => ...); 

使用TaskScheduler.FromCurrentSynchronizationContext()ContinueWith如果您需要訪問UI線程。

這是迄今爲止最簡單,最不詳細的做法...

+0

不錯,我會試試看。 – user1021726

相關問題