2012-09-04 37 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

也许你在使用参数吗?检查我的编辑。 –