in到底用不用索引

时间:2021-11-08 18:00:38

如题,字段A是聚集索引,那么我用A in ()这样的语句时,到底用不用索引.
还有用A not in ()时用不用索引?

好多材料上都说不用,但是我从MSSQL的执行计划上看到用索引,谁能说下.

21 个解决方案

#1


没试过
记得是不用的

#2


可是执行计划中显示聚集索引的.

#3


等等等等..........

#4


A in ()有两种形式

A in (x,y,z) 是用到索引的
A in (子查询) 是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引



#5


实际上:
A in (x,y,z) 
查询分析器自动按照

select ...
a=x
union 
select ...
a=y
union 
select ...
a=z

执行,当然用到索引

A not in (x,y,z) 
查询分析器自动按照

select ...
a<>x and a<>y and a<>z

执行,也会用到索引

#6


TO tx1icenhe(冒牌马可 V0.3)

如select * from tablea where id in(select id from tableb)

我看了下执行计划,tablea中的id也用索引,和你说的不一致

#7


关注,个人感觉not in是用不到索引的,in有时可以用到

#8


學習...

#9


可能跟统计等有关,Sql Server会从选择度等因素来判断用不用索引.

#10



没有人说个准点的吗?

#11


以执行计划里看到的为准!

A in ()有两种形式

A in (x,y,z) 是用到索引的
A in (子查询) 是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引

这个正确。

#12


A in (子查询) 是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引
这句话不理解.

select * form table_a where id in (select id from table_a where id in (1,2))
这个从执行计划看都用索引.

#13


in 可以用索引,可以不用索引,视情况而定。

#14


To:allright_flash

那不用的情况说说看.

#15


sql中非子查询是用到索引的
子查询是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引

#16


子查询是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引
这句话不理解,能不能举个sql语句说说啊,谢谢.

#17


现在可以确定:
IN(值列表)肯定用索引.
IN(子查询)这个还不清楚。
“子查询是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引
”怎么理解?谁给说下,说完给分结贴。

#18


现在可以确定:
IN(值列表)肯定用索引.
IN(子查询)这个还不清楚。
“子查询是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引
”怎么理解?谁给写个SQL示例说下,说完给分结贴。

#19



IN 里面的如果是字段值,并且建的索引上有这个值,是会用的。

反向查询一定不用。 像NOT IN 这种。

#20


IN 在一定情况下,和OR有些相似。

#21


TO : superunusa(迷失方向的蚂蚁) 


create table #T
(id int identity(1,1) primary key,userid varchar(20))
insert into #T select 'aa'
insert into #T select 'bb'
insert into #T select 'cc'
insert into #T select 'dd'
insert into #T select 'ee'
insert into #T select 'ff'
--set showplan_all on
select * from #T where id not in (3)
从执行计划上看,MSSQL将此句优化成:
select * from #T where id<3 or id>3 
这难道不是在使用索引吗?

#1


没试过
记得是不用的

#2


可是执行计划中显示聚集索引的.

#3


等等等等..........

#4


A in ()有两种形式

A in (x,y,z) 是用到索引的
A in (子查询) 是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引



#5


实际上:
A in (x,y,z) 
查询分析器自动按照

select ...
a=x
union 
select ...
a=y
union 
select ...
a=z

执行,当然用到索引

A not in (x,y,z) 
查询分析器自动按照

select ...
a<>x and a<>y and a<>z

执行,也会用到索引

#6


TO tx1icenhe(冒牌马可 V0.3)

如select * from tablea where id in(select id from tableb)

我看了下执行计划,tablea中的id也用索引,和你说的不一致

#7


关注,个人感觉not in是用不到索引的,in有时可以用到

#8


學習...

#9


可能跟统计等有关,Sql Server会从选择度等因素来判断用不用索引.

#10



没有人说个准点的吗?

#11


以执行计划里看到的为准!

A in ()有两种形式

A in (x,y,z) 是用到索引的
A in (子查询) 是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引

这个正确。

#12


A in (子查询) 是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引
这句话不理解.

select * form table_a where id in (select id from table_a where id in (1,2))
这个从执行计划看都用索引.

#13


in 可以用索引,可以不用索引,视情况而定。

#14


To:allright_flash

那不用的情况说说看.

#15


sql中非子查询是用到索引的
子查询是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引

#16


子查询是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引
这句话不理解,能不能举个sql语句说说啊,谢谢.

#17


现在可以确定:
IN(值列表)肯定用索引.
IN(子查询)这个还不清楚。
“子查询是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引
”怎么理解?谁给说下,说完给分结贴。

#18


现在可以确定:
IN(值列表)肯定用索引.
IN(子查询)这个还不清楚。
“子查询是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引
”怎么理解?谁给写个SQL示例说下,说完给分结贴。

#19



IN 里面的如果是字段值,并且建的索引上有这个值,是会用的。

反向查询一定不用。 像NOT IN 这种。

#20


IN 在一定情况下,和OR有些相似。

#21


TO : superunusa(迷失方向的蚂蚁) 


create table #T
(id int identity(1,1) primary key,userid varchar(20))
insert into #T select 'aa'
insert into #T select 'bb'
insert into #T select 'cc'
insert into #T select 'dd'
insert into #T select 'ee'
insert into #T select 'ff'
--set showplan_all on
select * from #T where id not in (3)
从执行计划上看,MSSQL将此句优化成:
select * from #T where id<3 or id>3 
这难道不是在使用索引吗?