2013-10-11 21 views
-3

我怎樣才能獲得最快的表現?我總是在客戶端應用程序上使用計算而不是在程序中進行計算我有一張約10,000行的表格進行評估。該數據庫位於託管Web服務器中,我一直在讀取所有行並在我的應用程序的數據網格中顯示。我如何才能在客戶端系統上獲得最快的性能?

因此,在閱讀專欄'ProductPrice'和'ProductQty'的方式中,我可以計算ProductPrice * Qty並將其存儲在應用程序中的另一個列中,考慮更少的數據流。

以下哪項會更快?

SqlCommand sqlCmdTxt = new SqlCommand(conn); 
SqlDataReader sqlRead; 

sqlCmdTxt.commandText = "Select ProductPrice, ProductQty, ProductPrice * ProductQty As Total From Stock"; 
sqlRead = sqlCmdTxt.ExecuteReader(); 
while (
sqlRead.Read()) { 
    double price = sqlRead.GetDouble(0); 
    double qty = sqlRead.GetDouble(1); 
    double sum = price * qty; 

    dataGridView.rows.add (new object[] {price, qty, sum}); 
} 

SqlCommand sqlCmdTxt = new SqlCommand(conn); 
DataSet dSet = new DataSet(); 
new SqlDataAdapter(new SqlCommand("Select ProductPrice, ProductQty, ProductPrice * ProductQty As Total From Stock" 
    , conn)).Fill(dSet, "StockList"); 
dataGridView.DataSource = dSet.Tables["StockList"].DefaultView; 
+3

你可以使用秒錶來評估它。爲什麼這樣? –

+0

我想這不會有任何顯着的差異。然而,我寧願把計算成C#代碼 –

+1

不,我發現這兩個20英尺的差異。所以,想想如果在500萬行的情況下......發生什麼事了? – Sayka

回答

6

計算本身可能是微不足道的(無論是在服務器還是客戶端上完成)。更爲重要的是物理數據檢索(查詢執行計劃,緩存,集羣,分區等)以及將數據從服務器傳輸到客戶端。

在這種特殊情況下,您在這兩種情況下都使用相同的查詢,所以我期望計算客戶端將簡單地將時間添加到查詢本身所需的時間(很少)任何情況。

但是,如果你有一個...

Select ProductPrice, ProductQty From Stock 

... ...與

Select ProductPrice * ProductQty As Total From Stock 

...我預計第二要稍快:轉移(從服務器到客戶端)一串較大的2字段元組(對於第一個查詢)可能比傳送相同數量的較小的1字段元組(用於第二個查詢)花費更多的時間。除此之外,它會消耗更多的可用網絡帶寬,影響其他併發客戶端。

如果你需要以任何方式過濾的數據,使用服務器端WHERE很可能是比所有行獲取到客戶端只是放棄大部分的行有更快。如果你有興趣的數據庫性能的話題,我熱烈建議採取一看:Use The Index, Luke!

建議:

  • 你的「默認」的位置應該是儘可能在服務器上實際可能的事。
  • 如果有疑問,請不要猜測,代之以度量有代表性的數據量(50000行在數據庫術語中幾乎不符合「大」的條件)。

或聚合(SUMAVGMAX ...)或JOIN等等

3

我的觀點是做服務器上的所有計算 - 它肯定要快。

如果對SQL Server使用較慢的機器,則可能會在服務器上運行更糟糕的結果。如果你在同一臺機器上運行它,我更喜歡使用SQL Server。

+0

從你的案件取決於你不會做什麼。如果你用c#迭代結果而不是用c#代碼進行計算,因爲你必須重複它們,並且一次計算不會有一定的時間差異。但是如果你將你的數據綁定到一些Grid,而不是從sql計算得更好。 –

+1

@KalanjDjordjeDjordje,你有沒有參考或僅僅是你的意見?沒有事實上的最佳實踐。它總是取決於許多因素。 – Jodrell

0

由於在SQL引擎和應用程序之間傳輸的數據較少,因此您的C#代碼可能會更快。對於50K行,這不是非常重要,但是可以節省傳輸成本的表可以通過較慢的網絡節省大量的行,這可能會造成顯着差異。

SQL第二次在您的服務器上運行時,SQL可能會緩存結果。所以它可能會更快(計算量更少),但您仍然會獲得轉賬成本。

+0

@Sayka表演不能「稍後添加」,你必須提前計劃。即使服務器和客戶端之間沒有網絡,仍然存在「傳輸成本」(可能是進程間通信,取決於DBMS),並且「物理檢索」方面不受任何影響。如果您總是獲取整個表格,則可能沒有顯着差異,但是您沒有使用該數據庫,因爲它應該被使用。 –

+1

@Sayka順便說一句,如果你只需要一個本地數據庫,也許SQL Server不應該是你的第一選擇?考慮一個嵌入式數據庫,如SQL Server Compact Edition或SQLite。 –

1

一般的存儲過程是更好 - 它不僅抽象底層數據庫架構從客戶端(給你更多的API方法到數據層),但它允許SQL引擎操縱數據並將結果返回給你。正如Branko所說,減少的數據傳輸可能很重要,但也要看你的代碼:你不僅要執行相同的舊乘法操作,還要運行客戶端驅動程序提取並將值轉換爲雙。這意味着您不僅可以從數據庫中獲取數據,將其放入緩衝區,將該緩衝區傳輸到客戶端,然後您可以將緩衝數據讀取到自己的字符串中,然後將其轉換。所有這些小小的代碼和緩衝區操作層都可以加起來,尤其是因爲您不知道在sql讀取調用中創建了什麼樣的臨時緩衝區來爲您提供值。

它也完全可能的SQL存儲過程注意到你要轉換爲雙倍的數據,並提供一個隱藏的雙重存儲與預先轉換爲您的數據;如果它知道你想要什麼(並且SP總是知道你所說的),它也可以提供很多緩存,所以當你第二次點擊該SP時,它只是返回未改變的數據以前的結果。

相關問題