2012-09-04 39 views
2

我注意到一些奇怪的行爲獲取SQL數據到C#應用程序。我使用了一個數據集xsd,但是這開始超時。然後我改變了我的方法,因爲我已經有了一個類,它會生成並返回一個數據表,用於我嘗試過的其他操作。這也超時了。SQL CPU峯值與SqlDataAdapter.Fill命令

我已經打開SSMS中的活動監視器,以瞭解代碼運行時發生在SQL中的情況,並注意到我運行它的方式,填充命令使SQL Sever在100%CPU達到峯值並保持停留狀態直到命令被取消。這是一個很好的服務器,擁有大量的240Ghz處理器和30GB內存。該查詢不完全是zippy,但在SSMS中在3秒內返回100k行。

這裏是我的數據集代碼:

 public DataTable UKDataRefresh() 
    { 
     UKREFRESH.UKNewContactsDataTable dt = 
      new UKREFRESH.UKNewContactsDataTable(); 
     UKREFRESHTableAdapters.UKNewContactsTableAdapter ta = 
      new UKREFRESHTableAdapters.UKNewContactsTableAdapter(); 

     ta.Connection.ConnectionString += ";Password = xxxxxx;"; 

     try 
     { 
     ta.Fill(dt, global::SilverPopTransfer.Properties.Settings.Default.UKDATELASTACTION); 

     } 
     catch (SqlException) 
     { 

      throw; 
     } 

     return dt; 

    } 

這是我建立它在飛行代碼:

public DataTableOperations (string strconnection, string strSelect,string tablename) 
{ 
     SqlConnection c = new SqlConnection(strconnection); 
     connection = c; 
     SqlDataAdapter da = new SqlDataAdapter(strSelect, connection); 
     DataSet ds = new DataSet(); 
     //added this to see what would happen. 
     da.SelectCommand.CommandTimeout = 0; 
     connection.Open(); 
     da.Fill(ds, tablename); 
     connection.Close(); 
     Datatable = ds.Tables[tablename]; 
     _disposed = false; 
    } 

進出口尋找線索,有的可能引起問題的,不完整的解決方案。
順便提一下,我在發佈之前在預先存在的控制檯應用程序中運行了類似的功能,並且它連接並正常運行:查詢幾乎完全相同。

唯一的區別是,對於預先存在的應用程序,我使用集成安全性,但在這種情況下,我指定了用戶和密碼。我已確認登錄憑證

回答

0

執行前檢查索引和set nocount on。 SSMS表現並不是一個好的表現指標。它只獲得部分數據並執行異步。嘗試調用一小部分數據或運行查詢而不填表。它可能是瓶頸。

如果您正在運行select參數,sql server將使用sp_execute執行它,然後服務器將其編譯爲創建CPE峯值。

+0

謝謝我看了一下代碼並嘗試了你的建議:'SqlCommand cmnd = new SqlCommand(strSelect,connection); CommandBehavior behave = CommandBehavior.Default; connection.Open(); IAsyncResult result = cmnd.BeginExecuteReader(behave);使用(SqlDataReader reader = cmnd.EndExecuteReader(result)){DisplayResults(reader); }'這和以前有相同的結果。即CPU中的大量尖峯和**很多進程觸發。 –

+0

也許你在使用參數嗎?檢查我的編輯。 –