SQL里IN的用法以及优化

 1.in后条件不多,可以考虑主表建索引,或用union all 代替

  2. in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

  3.如果in后接几百几千或几万的条件,可把in里的条件录入临时表,给临时表加索引,用表连接代替

  问题描述: id值可能有数千个之多,怎么提高效率?

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

  ************************************************************/

  --例如:

  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拆分后插入临时表

  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'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值