【小小问题集锦6之---查询条件非常复杂时解决效率不高的一个办法】

/*-------------------

*问题描述:查询条件非常复杂时,怎么提高效率?

*例子:select  *  from  table1  where  id  in  (1,3,6,10,...,8000)  and  type  =  1

*id值可能有数千个之多,这样查询起来非常慢,把id设为主键也很慢,请问有没有什么方法可以快一点? 

*解决方法:拆分条件

--------------------*/

--例如:

    select * from tb where id in(1,2,3,4,........) and name='best'

--这里的括号里面的数字有将近千个之多的时候,你就可以考虑这样

--1.将括号的条件做成变量

declare @str varchar(4000) set @str='1,2,3,4,5.......'

--2.然后将@s拆分后插入临时表,拆分一个字符串的方法参考:http://blog.csdn.net/feixianxxx/archive/2010/01/27/5263341.aspx

create  table  #t(  

id  varchar(10))  

declare  @i  int  

declare  @len  int  

set  @i  =  1  

while  @i  <  len(@str+',')  

begin  

insert  #t  select  substring(@str+',',@i,charindex(',',@str+',',@i)-@i)  

set  @i  =  charindex(',',@str+',',@i)+1  

end  

 

--3利用临时表和原表进行连接取值

select  k.*  from  tb k  

inner  join  #t p  on  p.id  =  k.id  

 where   name='best' 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值