SQL⾥IN的⽤法以及优化
1.in后条件不多,可以考虑主表建索引,或⽤union all 代替
2. 和 exists的区别: 如果⼦查询得出的结果集记录较少,主查询中的表较⼤且⼜有索引时应该⽤, 反之如果外层的主查询记录较少,⼦查询中的表⼤,⼜有索引时使⽤exists。其实我们区分和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执⾏⼦查询,所以我们会以驱动表的快速返回为⽬标,那么就会考虑到索引及结果集的关系了,另外IN时不对进⾏处理。
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.将括号的条件做成变量
exists的用法DECLARE @str VARCHAR(4000)
SET @str = '1,2,3,'
--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'
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论