none
請問同一段SQL語法撈資料, 怎麼速度可以差到那麼多? RRS feed

  • 問題

  • 開發環境:C#.NET 2005
    資料庫:SQL Server 2005

    我盡量簡短一點
    希望可以看的懂

    第一種用傳參數的寫法取得資料
    DbCommand p_cmd = DbConnection.CreateCommand();
    p_cmd.CommandText = strSQL;
    p_cmd.CommandType = CommandType.Text;
    
    DbParameter p_dbParameter = p_cmd.CreateParameter();
    p_dbParameter.DbType = DbType.String;
    p_dbParameter.ParameterName = "@value";
    p_dbParameter.Value = strValue;
    p_dbParameter.Direction = ParameterDirection.Input;
    p_cmd.Parameters.Add(p_dbParameter);
    
    DataTable dt = new DataTable();
    p_dbDataAdapter.SelectCommand = p_cmd;
    p_dbDataAdapter.Fill(dt);

    第二種用取代字串的寫法取得資料
    DbCommand p_cmd = DbConnection.CreateCommand();
    strSql = strSql.Replace("@value", "'" + strValue + "'");
    p_cmd.CommandText = strSQL;
    p_cmd.CommandType = CommandType.Text;
    
    DataTable dt = new DataTable();
    p_dbDataAdapter.SelectCommand = p_cmd;
    p_dbDataAdapter.Fill(dt);

    兩種寫法都是用同一段SelectCommand (strSQL)
    撈出來的資料不到100筆

    可是第一種傳參數的寫法
    撈資料花了將近10分鐘
    而且會造成dbserver的loading變很重
    (不管下幾次查詢結果都一樣)

    而第二種寫法查詢不到20秒鐘資料就出來了
    跟直接用SQL管理員查是差不多的時間

    但我的程式目前都用第一種傳參數的寫法
    有的查詢很正常
    有的查詢就會變很慢
    是不是我寫法不正確呢?

    請教要怎麼改善?
    謝謝
    2009年10月29日 上午 09:53

解答

  • 之前有看過兩位高手有寫過類似這情況的文章,供參考.

    http://blog.miniasp.com/post/2009/01/Using-OracleParameter-will-cause-performance-problem.aspx

    http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/02/12/4201.aspx#4208
    2009年10月30日 上午 03:35

所有回覆

  • 你可以用 EXEC sp_executesql 來跑看看你那個用參數的查詢。
    ADO.NET 的參數化查詢就是用這個方法。

    不過沒看到你完整的 SQL,也沒辦法直接就判斷原因是什麼。
    因為我也用參數化查詢(而且是完全使用),也沒碰過這樣的問題...
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    如果只會用 "看" 的學程式,那不如早點改行,以免誤己一生...
    若不想快點得到解答,可以儘量把問題寫模糊一點,愈模糊愈不會得到解答。
    除非不能打中文,否則請尊重當地語系的網友,使用中文發問或回答,這是一種基本禮貌。
    2009年10月29日 上午 11:26
    版主
  • 之前有看過兩位高手有寫過類似這情況的文章,供參考.

    http://blog.miniasp.com/post/2009/01/Using-OracleParameter-will-cause-performance-problem.aspx

    http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/02/12/4201.aspx#4208
    2009年10月30日 上午 03:35
  • HI,

    您可以檢查一下, 是否發生了Parameter Sniffing現象, 造成透過Stored Procedure執行反而較慢:
    SQL Garbage Collector: Parameter Sniffing & Stored Procedures Execution Plan(http://omnibuzz-sql.blogspot.com/2006/11/parameter-sniffing-stored-procedures.html)
    2009年10月30日 上午 04:07
  • 之前有看過兩位高手有寫過類似這情況的文章,供參考.

    http://blog.miniasp.com/post/2009/01/Using-OracleParameter-will-cause-performance-problem.aspx

    http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/02/12/4201.aspx#4208

    正解

    剛測試了
    確實是資料型態造成
    把原本傳的參數改成使用下面的方式
    SqlParameter Parameter = new SqlParameter();
    Parameter.SqlDbType = SqlDbType.VarChar;
    一切恢復正常

    困擾了好久
    今天終於解決
    感激各位大力協助
    謝謝
    2009年10月30日 上午 06:17