日期:2014-05-18  浏览次数:20619 次

SQL In 语句优化
sql2000  
有表A 主键id ,几十万数据

用 select * A where id in(55,66,77……)

发现cpu 会 20% 多


请教 有什么方法 可以优化

------解决方案--------------------
sql2000 貌似没啥好的解决方案,升级到05或者08吧
------解决方案--------------------
in的语法不能优化了.

按照取值不同,也许可以使用其他语句代替.
------解决方案--------------------
版本的提升,功能的优化,速度随着提升啦。
探讨

引用:

sql2000 貌似没啥好的解决方案,升级到05或者08吧


05 08 如何优化语句呢

------解决方案--------------------
没别的,就是升级硬件和软件!
------解决方案--------------------
把id in(55,66,77……)改成 in=55 or in=66 or in=77 试试
------解决方案--------------------
把in里面的数字,放入临时表试下
------解决方案--------------------
不应该吧,才几十万条记录而已就不行了????升级硬件吧
------解决方案--------------------
用楼上说的,把数字先放入临时表,然后用
select a.* From A a inner join 临时表 b on a.id=b.id

应该可以快2倍以上。
------解决方案--------------------
几十万条数据,执行查询 CPU会20%多?
------解决方案--------------------
探讨

把in里面的数字,放入临时表试下

------解决方案--------------------
有两种方法你可以试试,
1.把in里面的东西放到临时表,再用表关联速度会大幅提升;
2.把in替换成 union all 速度也会快很多,不过用union all sql 会比较长
------解决方案--------------------
查查id上的索引是否被去掉啦。。。
------解决方案--------------------
对看看索引
------解决方案--------------------
都说是索引啊?
------解决方案--------------------
先把(55,66,77.。。。)存放到一张表,临时表或实际表都可以 ,为B表,则语句可写成

select * from A a where exists(select 1 from B b where a.id=b.id)


记住,不要用in ,用exists,才是ok的!
------解决方案--------------------
--in的内容
declare @count varchar(2000)
set @count='111,2222,111,2222'
select * A where id in(
select 
substring (value,charindex(',',value)+1,len(value)) as sales
from
dbo.SplitToTable(@count, ','))
------解决方案--------------------
17楼正解