Asp.net SqlCommand在使用参数执行查询时速度较慢
DbDataAdapter.Fill在执行参数时非常慢 我有一个内部有2个参数的查询,当我将这些参数硬编码到查询中时,需要1秒才能在470k表行中执行,只返回20行 我在这里发现了许多类似的帖子,我尝试了所有这些解决方案,包括arithabort、option recompile、option optimize for。。。没有运气 我只是执行sql server 2008查询,而不是存储过程,因此使用arithaport的查询如下所示: 我还尝试在同一事务中调用set arithabort,但首先执行该查询 我不知道我是否做错了什么,但感觉是ado.net在ado.net中执行了一个非常糟糕的执行计划,当我在上面定义了参数时 由于这个错误的选择,在SSMS中缓存后的执行时间是1秒,而在asp中则是9秒 查询如下所示: strSQL@= 挑选* 来自表1 其中Name像@Name 然后: 编辑:2013年1月14日18:44 我不再从DbProviderFactory检索连接,而是直接使用SqlConnection和SqlCommand。我知道DbCommand和DbProvider是一个基本类。。。但我认为还有更多的东西在里面。。因为性能会急剧增加300% 这不是fill方法,因为我已经尝试了前面显示的代码 无论如何,我不知道为什么,但是使用SqlConnection要快得多!有什么想法吗?也许不是在制定以前制定的糟糕的执行计划 任何帮助都将不胜感激 谢谢,我找到了解决方案 真是太棒了 我在列表中使用了错误的类型 Parametross.Addbd。MakeParameter@val,%+txtFind.Text+%, 字符串 String与DbType.AnsiString 虽然DbType.String和DbType.ansisting都处理字符数据,但这些数据类型的处理方式不同,使用错误的数据类型可能会对应用程序的性能产生负面影响。String将参数标识为2字节的Unicode值,并以此方式发送到服务器。DbType.AnsiString会将参数作为多字节字符串发送。要避免过度的字符串转换,请使用: char或varchar列和参数的DbType.ansisting。 unichar和univarchar列和参数的DbType.String。 资料来源: 在我的查询中,有一个: 。。。。 其中Table.Col1类似于@val 但是列类型是varchar,我应该使用DbType.AnsiString,而不是DbType.String Parametross.Addbd。MakeParameter@val,%+txtFind.Text+%, DbType.AnsiString 在我的大桌子上,我做了很多不必要的造型,这就是性能急剧下降的原因 希望这能帮助别人,我找到了解决办法 真是太棒了 我在列表中使用了错误的类型 Parametross.Addbd。MakeParameter@val,%+txtFind.Text+%, 字符串 String与DbType.AnsiString 虽然DbType.String和DbType.ansisting都处理字符数据,但这些数据类型的处理方式不同,使用错误的数据类型可能会对应用程序的性能产生负面影响。String将参数标识为2字节的Unicode值,并以此方式发送到服务器。DbType.AnsiString会将参数作为多字节字符串发送。要避免过度的字符串转换,请使用: char或varchar列和参数的DbType.ansisting。 unichar和univarchar列和参数的DbType.String。 资料来源: 在我的查询中,有一个: 。。。。 其中Table.Col1类似于@val 但是列类型是varchar,我应该使用DbType.AnsiString,而不是DbType.String Parametross.Addbd。MakeParameter@val,%+txtFind.Text+%, DbType.AnsiString 在我的大桌子上,我做了很多不必要的造型,这就是性能急剧下降的原因Asp.net SqlCommand在使用参数执行查询时速度较慢,asp.net,sql-server,performance,ado.net,oledbdataadapter,Asp.net,Sql Server,Performance,Ado.net,Oledbdataadapter,DbDataAdapter.Fill在执行参数时非常慢 我有一个内部有2个参数的查询,当我将这些参数硬编码到查询中时,需要1秒才能在470k表行中执行,只返回20行 我在这里发现了许多类似的帖子,我尝试了所有这些解决方案,包括arithabort、option recompile、option optimize for。。。没有运气 我只是执行sql server 2008查询,而不是存储过程,因此使用arithaport的查询如下所示: 我还尝试在同一事务中调用set arithabort,但
希望这会对某些人有所帮助,这可能是ODBC(速度非常慢)和定制的SQL Server程序集(其中包含各种优化)之间的区别。在任何情况下,编辑部分之后的所有内容实际上都是答案。你应该把它移到一个答案中,然后接受它,这样将来的用户可能会跳过你的问题,因为它没有被接受的答案。这可能是ODBC和定制的SQL Server程序集之间的区别,ODBC是出了名的慢,而定制的SQL Server程序集中有各种各样的优化。在任何情况下,编辑部分之后的所有内容实际上都是答案。您应该将其移动到一个答案中,然后接受它,以便将来的用户可以跳过您的问题,因为它没有可接受的答案。
string strSql = @"set ARITHABORT ON;
select TOP 20 ....
DbProviderFactory factory = DbProviderFactories.GetFactory(mProvider);
DbCommand dbcmd = factory.CreateCommand();
if (CommandTimeout != null)
dbcmd.CommandTimeout = CommandTimeout.Value;
if(this.transaccion != null)
dbcmd.Transaction = this.transaccion;
dbcmd.Connection = dbc;
dbcmd.CommandText = strSQL;
if (parametros != null)
dbcmd.Parameters.AddRange(parametros);
DbDataAdapter dbda = factory.CreateDataAdapter();
dbda.SelectCommand = dbcmd;
DataTable dt = new DataTable();
dbda.Fill(dt);
return dt;
SqlCommand objCmd = new SqlCommand(strSQL, sqlConn);
if (CommandTimeout != null)
objCmd.CommandTimeout = CommandTimeout.Value;
if (this.transaccion != null)
objCmd.Transaction = SQLtransaccion;
if (parametros != null)
objCmd.Parameters.AddRange(parametros);
DbDataReader dbReader = objCmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dbReader);
dbReader.Close();
return dt;