请假个问题!

jiangshun 2011-12-29 02:48:06
/*
表中记录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类型会有这样的差别?

谢谢!
...全文
488 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangshun 2011-12-29
  • 打赏
  • 举报
回复
最终解决还是用varchar类型的参数!

大叔啊,为什么是数据量超过KW时容易出现?
几条或者几W条的时候都可以?

这个有些不解!

jiangshun 2011-12-29
  • 打赏
  • 举报
回复
谢谢大叔,我试试



谢谢小爱!
水族杰纶 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 beirut 的回复:]
SQL code
set statistics IO on
declare @SN nvarchar(20)='ABCDEFGH'
exec ('select * from tb where name=''@SN''')
set statistics IO off


这样就一样了。。。。。。
[/Quote]
学习.
黄_瓜 2011-12-29
  • 打赏
  • 举报
回复
set statistics IO on
declare @SN nvarchar(20)='ABCDEFGH'
exec ('select * from tb where name=''@SN''')
set statistics IO off


这样就一样了。。。。。。
黄_瓜 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jiangshun 的回复:]

引用 1 楼 beirut 的回复:

sf 你好意思发60的帖子


哥,我总共也就61分!
[/Quote]
结贴吧,你会得到30分的
nzperfect 2011-12-29
  • 打赏
  • 举报
回复
这种问题在数据量超过KW时容易出现,类似的还有比如表字段是int,变量是bigint.

你尝试一下更新统计信息,看有没有改善?UPDATE STATISTICS 表名,SN所在索引

最好的解决办法还是把变量定义成和表内字段相同的类型。
jiangshun 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 perfectaction 的回复:]

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

对对,SN是varchar类型的
--小F-- 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jiangshun 的回复:]
不是一起执行的

我也觉得不会有区别的
但是在我这个电脑上执行了确实不一样
[/Quote]
和大叔交流了一下 是你表里面的字段类型是varchar 而你定义的为nvarchar的话 需要涉及到类型转换

走不到INDEX 只能SCAN 全表扫描


顺便说下 大叔V5 偶像级别的人物
jiangshun 2011-12-29
  • 打赏
  • 举报
回复
不是一起执行的

我也觉得不会有区别的
但是在我这个电脑上执行了确实不一样
nzperfect 2011-12-29
  • 打赏
  • 举报
回复
这个是取决于SN类型的,说明你表里的SN是varchar类型而不是nvarchar,相关的还有int和bigint.
-晴天 2011-12-29
  • 打赏
  • 举报
回复
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 次。
*/
-晴天 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dielianhua_chenlong 的回复:]

同意楼上的。。我也怀疑你是两段代码一起执行的。。。
[/Quote]

不会是一起执行的,如果一起执行,变量会定义两次.
-晴天 2011-12-29
  • 打赏
  • 举报
回复
没有你那个表,换了个表,在08上测,用 varchar 和 nvarchar 木有区别.
  • 打赏
  • 举报
回复
同意楼上的。。我也怀疑你是两段代码一起执行的。。。
--小F-- 2011-12-29
  • 打赏
  • 举报
回复
哥,你不会把两段代码放一起执行的吧?
快溜 2011-12-29
  • 打赏
  • 举报
回复
你把缓存清了比较结果
jiangshun 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 beirut 的回复:]

sf 你好意思发60的帖子
[/Quote]

哥,我总共也就61分!
黄_瓜 2011-12-29
  • 打赏
  • 举报
回复
sf 你好意思发60的帖子

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧