none
處理速度及資源耗用問題 RRS feed

  • 問題

  • 想請問各位以下方式在處理速度及資源耗用問題:

    1. 一開始先宣告SqlParameter(大致如下的程式碼)和要新增/修改時,再宣告sqlCmd.Parameter.Add().Values的用法,不知其耗用資源及處理速度那個比較好

    2. 宣告多個datatable或宣告一個dataset內含多個datatable

     privater void btnOk_click()

    {

     SqlParameter[] sqlPms = new SqlParameter[27];  //Master參數

     SqlParameter[] sqlPmsD = new SqlParameterDevil;  //Detail參數

     sqlPms[0] = new SqlParameter("Name1", SqlDbType.NVarChar);

     sqlPms[0].Value = "test1"; ...

     sqlPms[26] = new SqlParameter("Name2", SqlDbType.NVarChar)

     sqlPms[26].Value = "Test2";

     sqlPmsD[0] = new SqlParameter("Name3", SqlDbType.NVarChar);..............

     sqlPmsD[5] = new SqlParameter("Name4", SqlDbType.NVarChar);

    if (新增)

    {

        sqlCmd = new SqlCommamd(" insert into quote(..........) values(........),sqlCn);

        sqlCmd1 = new SqlCommamd(" insert into quotedetail(....) values(......),sqlCn);

       sqlCmd.Parameters.AddRange(sqlPms);

       sqlCmd.ExecuteNonQuery();

       sqlCmdD.Parameters.AddRange(sqlPmsD);

      for (int i=0 ;i< 5;i++)

      {  sqlCmdD.ParametersIdea.Values = "Test2";

         sqlCmd1.ExecuteNonQuery(); }

    }

    if (修改)

    {

        sqlCmd = new SqlCommamd(" update ......",sqlCn);

        sqlCmd1 = new SqlCommamd(" update .........",sqlCn);

        //修改參數設定同新增}

    2006年10月21日 上午 06:55

解答

  • 1. 一開始宣告好 SqlParameter,且 SQL 指令不變的話,這樣速度會比較快,但資源一定會有消耗,不過不知道你的環境可能會有多少 Client,如果 Server Computing 能力允許的話,我比較傾向於動態產生,需要時再執行,除非那支 SQL 會經常的執行 .

    2. 若產生一個 DataTable 佔記憶體 100K,那 1000 users 要使用的記憶體量可能就很可觀了(100MB),10000 users 更可能會吃掉 1GB,而一個 DataSet 假設包含很多 DataTable,也是佔了 100K 的話,計算方法就如前面,所以要視你的環境來決定,我自己是儘可能不要使用 Session,以及少把 DataSet/DataTable 放在 Server 記憶體中,除非很常用 .

    2006年10月21日 下午 11:29
    版主

所有回覆

  • 補充:

    因自己尚無法判斷那個是較省資源的方式,所以目前是先用宣告SqlParameter,並且把值放好,到處理新增/修改時,有特殊的值的話再重新放一次

    (因同時可能會有多人連至DB,且同一人可能同時開啟多個作業,所以想盡量取一個不會對user造成困擾的方法,如存取的速度...)

    若各位有任何的建議或其它看法,煩請再指教一下,謝謝!

    2006年10月21日 下午 06:30
  • 1. 一開始宣告好 SqlParameter,且 SQL 指令不變的話,這樣速度會比較快,但資源一定會有消耗,不過不知道你的環境可能會有多少 Client,如果 Server Computing 能力允許的話,我比較傾向於動態產生,需要時再執行,除非那支 SQL 會經常的執行 .

    2. 若產生一個 DataTable 佔記憶體 100K,那 1000 users 要使用的記憶體量可能就很可觀了(100MB),10000 users 更可能會吃掉 1GB,而一個 DataSet 假設包含很多 DataTable,也是佔了 100K 的話,計算方法就如前面,所以要視你的環境來決定,我自己是儘可能不要使用 Session,以及少把 DataSet/DataTable 放在 Server 記憶體中,除非很常用 .

    2006年10月21日 下午 11:29
    版主
  • 謝謝小朱的回覆。

    我少了描述我的作業是Window Form,程式(exe)是在Client端,所以記憶體是耗用在Client端,同時會與Server連線的人數大約30人左右吧,而每個User的Ram是512,同一使用者可能會陸續開啟如Form1,Form2....等但未close掉

    因考量cmd.Parameter宣告是需在connection下,所以與Server的連線時間會較長,不過,有找了其它人發表的資源耗用問題後(http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=496393&SiteID=14),我可能會朝著拉長與DB連線時間,盡量減少預先準備好資料的做法

    另我發現此種問題可能較適合.net Framework板的屬性,所以跟各位說聲抱歉。

    若各位有建議的,再請各位指點一下了,謝謝!

    2006年10月22日 上午 03:16
  • 如果你要採取握住 connection 一段時間的方法,那你要注意 SQL Server 的 CAL 數量,並且在多人環境,應該是要讓資料連線到資料庫的時間愈短愈好 ...
    2006年10月22日 下午 12:15
    版主
  • 謝謝你的提醒,SQL Server的CAL問題我倒是沒想到,我會去注意的,謝謝。因看了其他人發表的資源問題,發現隨便開了幾個Form,資源就吃了不少,怕user的Ram不足。不過,自己可能會先用一些基本的頁面實測看看。

    謝謝!

    2006年10月22日 下午 03:50
  • 我給你幾個建議:

    • 不必太過擔心用戶端記憶體不足,除非你的環境中還有記憶體 128MB 以下的用戶端電腦 .
    • DataSet 大小要限制,不要因為不是伺服端電腦就可以無限擴大(如果是多 Form 共用,可考慮設為全域變數)
    • 資料庫 connection 仍然儘量要以不把持的方法設計較佳,因為 connection 對資料庫來說是很重要的資源,在多人使用的狀況下,連線數最好是能保持在一定程度之下,只有一定要和資料庫通訊與存取時,才要用到 connection.
    2006年10月23日 上午 02:03
    版主
  • 謝謝小朱的建議,我會去注意的,謝謝!
    2006年10月23日 上午 11:28