Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net SqlCommand在使用参数执行查询时速度较慢_Asp.net_Sql Server_Performance_Ado.net_Oledbdataadapter - Fatal编程技术网

Asp.net SqlCommand在使用参数执行查询时速度较慢

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,但

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

在我的大桌子上,我做了很多不必要的造型,这就是性能急剧下降的原因


希望这会对某些人有所帮助,

这可能是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;