SqlParameter使用参数错误,提示请求超时或则查询速度过慢

1.SqlParameter使用参数错误,提示请求超时,直接拼接字符串后就行

2.参数化查询比拼接字符串慢的原因

以上原因都是因为sql参数没有加SqlDbType 导致的

使用追踪器发现,以下这样写的语句,最后生产的代码图2,会根据具体的字段查找其类型,所以速度很慢

   List < SqlParameter > sqlParams = new List<SqlParameter>();
            sqlParams.Add(new SqlParameter("@startDatetime", startDatetime));
            sqlParams.Add(new SqlParameter("@endDateTime", endDatetime));
exec sp_executesql N'select a.jitai,a.shebeihao,b.jizhong, JiadongLv,b.latest_datetime,case when b.latest_datetime is not null then ''RUN'' end as ShebeiZhuangtai
from [ProductionData_TuheiAVI].[dbo].[TuheiAVI_Basic] a
left join( select jitai, jizhong, 0 as JiadongLv, max(datetime) as latest_datetime,
row_number() over(partition by jitai order by max([datetime]) desc) as number
from [ProductionData_TuheiAVI].[dbo].[TuheiAVI_info]
where [datetime] between @startDatetime and @endDateTime
group by jitai, jizhong) b on a.jitai = b.jitai
where isnull(b.number,1)=1 order by a.jitai,
latest_datetime desc
',
N'@startDatetime datetime2(7),@endDateTime datetime2(7)',@startDatetime='2020-11-11 08:20:29',@endDateTime='2020-11-11 10:20:29'

 ps:当时有时候日期类型设置了DBsqlType ,依旧会慢,不明原因?

 总而言之,写存储过程或者C#时,如果遇到参数化比非参数化查询时间要长,就检查下其参数的类型,如果还是不行,就只能拼接字符串了

 

来源:https://www.cnblogs.com/OpenCoder/p/4561532.html

参数化查询比拼接字符串慢的原因

 我们都知道,参数化查询可以处理SQL注入,以及提高查询的效率,因为参数化查询会使MSSQL缓存查询的计划.

但是现在我发现一个奇怪的问题,就是参数化查询比字符串拼接要慢,而且速度相差10倍之多.

SQL语句是:

select * from T_Message where T_Message.BelongTo=@BelongTo

开始在ADO.NET中用SqlParameter传递参数@BelongTo时是这么写的

SqlParameter param1 = new SqlParameter("@BelongTo","20782c1090fe47e2838b125cb25c1d39");

结果发现上面这段代码在ADO.NET中执行查询,比在查询分析中直接执行下面的SQL慢10倍之多。。。

select * from T_Message where T_Message.BelongTo='20782c1090fe47e2838b125cb25c1d39'

结果将SqlParameter改为下面这样,增加参数SqlDbType的声明后,ADO.NET的查询就变得和在查询分析器中执行一样快了

SqlParameter param1 = new SqlParameter("@BelongTo", SqlDbType.Char,32);
param1.Value = "20782c1090fe47e2838b125cb25c1d39"; 

 

原因:

经过查阅资料和自己的分析后,得知原来是字符类型的不匹配造成的。因为这个数据表是客户数据库中的,我只是提取数据,而我一般建数据表都使用NVarchar类型,而客户的这个表使用的是Char(32),在查询分析器中直接写字符串作为查询条件时,查询优化器认为条件中等号两边的字符类型是相同的,从而会选择聚集索引查询,而在ADO.NET中使用SqlParameter后,因为字段类型错误导致了Sql查询从索引扫描变成了表扫描... 所以为了避免在Sql查询中由于条件字段类型不匹配而导致表扫描,记得以后在创建SqlParameter时声明SqlDbType就解决问题了。

posted @ 2020-11-04 11:55  海龟123  阅读(445)  评论(0编辑  收藏  举报