日期:2014-05-17  浏览次数:20732 次

问下Charindex与in的性能

and Employees.Level in (select value from Split(TransactorOptions.LevelEmployee, ','))
与 and charindex(Employees.Level,TransactorOptions.LevelEmployee) > 0


当我使用上一条语句作关联条件时,查询不到1秒
当我使用下面的语句作关联条件时,查询要1分半到2分钟

快的理由是什么,谁能告诉我下....

Level 是int型,可能为0-9的任何一个数字,LevelEmployee是字符,类似"1,3,9"这样。
------解决方案--------------------
in 是在结果集中查找。int 比较速度不言而喻。
charindex,需要把int 转换成char 然后在字符串中逐个对比查找,逐行逐字符 ,工作量大
------解决方案--------------------
引用:
SQL code?123and Employees.Level in (select value from Split(TransactorOptions.LevelEmployee, ','))与 and charindex(Employees.Level,TransactorOptions.LevelEmployee) > 0

当我使用上一条语句作关联条件时,查……


得看执行计划里面的差异,虽然直接表现为是这两个语句上的不同。
但涉及链接以及相关索引的使用,也相应的有很大影响。
LZ看下执行计划先...
------解决方案--------------------
不推荐使用charindex()  很损失性能的  in一般都可以用exists替换掉  效率上有时候会不一样
------解决方案--------------------
引用:
不推荐使用charindex()  很损失性能的  in一般都可以用exists替换掉  效率上有时候会不一样


仅在列有null 值 not逻辑 的时候会有大的性能提升。
参考http://blog.csdn.net/orchidcat/article/details/6267552

------解决方案--------------------
引用:
引用:不推荐使用charindex()  很损失性能的  in一般都可以用exists替换掉  效率上有时候会不一样

仅在列有null 值 not逻辑 的时候会有大的性能提升。
参考http://blog.csdn.net/orchidcat/article/details/6267552




效率上有时候会不一样
------解决方案--------------------
in 可以利用索引,而charindex不能。
------解决方案--------------------
楼主不说这个level是不是设定的null 还是not null
------解决方案--------------------
charindex是要查询你的字符串内容,越大时间越长,另外,最好的解释应该从执行计划上去看,而不是单单的猜测
------解决方案--------------------
先看看查询计划吧
------解决方案--------------------
使用charindex对两个列进行运算, 使得索引没有使用的可能。

in操作中, split仅对后一个列操作, 对于employees.level字段索引仍有效。
------解决方案--------------------
引用:
引用:
charindex是要查询你的字符串内容,越大时间越长,另外,最好的解释应该从执行计划上去看,而不是单单的猜测
这个是charindex的开销,我只截取了一部分:
从执行计划去分析两者有哪些区别,特别注意两者间占用百分比最大的那部分
------解决方案--------------------
学习!