/*
表中记录Rows:40846773
字段SN:nonclustered, unique, primary key located on PRIMARY
*/set statistics IO on
declare @SN varchar(20)='ABCDEFGH'
select * from TB where SN=@SN
set statistics IO off--扫描计数 0,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
set statistics IO on
declare @SN1 nvarchar(20)='ABCDEFGH'
select * from TB where SN=@SN1
set statistics IO on--扫描计数 1,逻辑读取 6346 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次数据库用的sql2008
为什么@SN varchar类型的和@SN1 nvarchar类型会有这样的差别?谢谢!

解决方案 »

  1.   

    没有你那个表,换了个表,在08上测,用 varchar 和 nvarchar 木有区别.
      

  2.   

    set statistics IO on
    declare @SN varchar(20)='ABCDEFGH'
    select * from csdnscore where r=@SN
    set statistics IO off
    go
    set statistics IO on
    declare @SN nvarchar(20)='ABCDEFGH'
    select * from csdnscore where r=@SN
    set statistics IO off
    /*
    (0 行受影响)
    表 'csdnscore'。扫描计数 1,逻辑读取 157 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。(0 行受影响)
    表 'csdnscore'。扫描计数 1,逻辑读取 157 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    */
      

  3.   

    这个是取决于SN类型的,说明你表里的SN是varchar类型而不是nvarchar,相关的还有int和bigint.
      

  4.   

    和大叔交流了一下 是你表里面的字段类型是varchar 而你定义的为nvarchar的话  需要涉及到类型转换走不到INDEX 只能SCAN 全表扫描
    顺便说下 大叔V5 偶像级别的人物
      

  5.   


    对对,SN是varchar类型的
      

  6.   

    这种问题在数据量超过KW时容易出现,类似的还有比如表字段是int,变量是bigint.你尝试一下更新统计信息,看有没有改善?UPDATE STATISTICS 表名,SN所在索引最好的解决办法还是把变量定义成和表内字段相同的类型。
      

  7.   

    set statistics IO on
    declare @SN nvarchar(20)='ABCDEFGH'
    exec ('select * from tb where name=''@SN''')
    set statistics IO off这样就一样了
      

  8.   

    最终解决还是用varchar类型的参数!大叔啊,为什么是数据量超过KW时容易出现?
    几条或者几W条的时候都可以?这个有些不解!