2012-02-27 35 views
3

我正在使用SQL數據庫存儲和我的網站是在c#中,並且都在同一臺服務器上。什麼是最好的計算平臺SQL或c#

我已經插入了學生結果在DataBase中的表中,其中包含像TestType,MAxMarks和MarksObtained字段。

現在我必須在一個鏡頭中顯示完整的結果,所以我必須添加所有測試類型的標記和學生在這些測試中獲得的標記以顯示最終結果。

我的問題是,

1)我應該從數據庫中讀取整個表,並做在C#類中的所有計算? 或 2)我應該使用SQL服務器內的t-SQL進行所有計算,然後獲取結果?

以上哪兩種方案更適合服務器?我不想在服務器上造成很大的負載,因爲數據庫對於各種自動登錄都很重要。

這應該是服務器負載方面的理想最佳實踐。

+4

即使在同一臺服務器上,有兩個進程之間拋出所有的數據沒有任何好處 – 2012-02-27 09:55:22

回答

4

將其作爲查詢的一部分。讓數據庫在這種情況下完成工作。如果你有正確的索引,這應該不成問題。如果你拿起整個桌子,那麼你將耗盡內存。

3

1)我應該從數據庫中獲取整個表並在c#類中進行所有計算嗎?或者2)我應該使用SQL服務器內的t-SQL執行所有計算,然後獲取結果?

啊 - 這取決於。

與結果相比,故事有多大?如果你不得不拉動100萬行計算10,那麼這是不好的。如果你拉100行並將其全部顯示出來,那麼決定就不同了。

以上哪兩種方案更適合服務器?

定義服務器。更多的數據庫服務器友好,或更多的應用服

我不想在服務器上負載太多,因爲數據庫是巨大的各種自動登錄。

定義休和「各種同時登錄」。不是ethat hugh現在是1000gig +,sql server在處理10.000並行登錄時沒有問題,所以你的服務器可能很小,而且你很少有用戶。

認真 - 這取決於。 SQL通常是一個壞層或複雜計算,因爲它很難擴展和昂貴(授權),但如果另一種方法是將一百萬行向下拖動以進行一些模擬計算 - 猜猜看,這是可行的。儘管如此,它需要更多的基礎知識。

1

正如其他人已經提到,一切都取決於您的項目的具體情況。

還要記住,根據情況(例如,許多讀取但非頻繁的更改)可能需要預先計算報告並將結果存儲在數據庫中。例如,我想你的學生報告結果不會每天更改一次。在晚上(或其他知道不太忙的時間)運行批處理作業,計算所有報告並將它們存儲在數據庫中(甚至可能是專用的報告數據庫)。這樣獲取報告便宜而且不會干擾在線交易。您甚至可以使報表計算更加智能,並且只有在結果實際發生變化時纔會觸發。

我也建議在C#而不是數據庫中進行復雜的計算。它更便攜,更強大,通常更容易測試。

0

由於您的調整要求目前很簡單(只是每個測試可能一年/學生的總和)。您有以下選項。

解決方案#1

進行數據庫UDF(testName,studentName,year);這個UDF裏面你可以運行一個交換機或不同的if else語句,其由學生姓名,年或所有學生,各年返回 結果。

優點:

  • 所有結果邏輯emebed到UDF。對於演示級別的任何新表單/要求,您不必再次計算 結果&。 缺點:
  • 您必須監控SQL性能時,表規模的增長

  • 你不能做的UDF

解決方案#2

做一個實用工具裏面很多複雜的計算在演示文稿層上總結所有結果&提供給您的演示文稿圖層。 優惠價: 您可以在這裏輕鬆地進行復雜的計算。 缺點: 可能是一個資源豬當結果集是巨大的

解決方案#3 做一個SQL觸發器&一個單獨的結果表像

MaxMarks MarksObtained StudentId Status Year 
------------------------------------------------- 
500  100   1   Failed 2011 
400  300   1   Passed 2010 

你必須代碼這樣的方式觸發它在主表上每行成功插入後運行,這些結果將自行填充。您可以根據您的要求查詢此表中的結果。

優點:

  • 沒有太多的工作需要
  • 快速 缺點: 難以調試。 你必須絕對確保觸發器正常工作&不弄亂任何記錄後
相關問題