• 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就解决问题了。

  • 相关阅读:
    How to solve the problem "A project with an Output Type of Class Library cannot be started directly "
    Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等)
    JavaScript实现startWith、endWith效果函数
    不同格式证书导入keystore方法
    用KeyTool生成安全证书
    怎样让操作系统的虚拟机退出全屏?
    对https的理解
    JDK中keytool常用命令
    百折不回结局凄惨的金庸反角
    主题数据库的特征
  • 原文地址:https://www.cnblogs.com/haigui-zx/p/13925153.html
Copyright © 2020-2023  润新知