in到底用不用索引

no_mIss 2006-10-09 09:47:08

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

好多材料上都说不用,但是我从MSSQL的执行计划上看到用索引,谁能说下.
...全文
687 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
no_mIss 2006-10-11
  • 打赏
  • 举报
回复
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
这难道不是在使用索引吗?
superunusa 2006-10-11
  • 打赏
  • 举报
回复
IN 在一定情况下,和OR有些相似。
superunusa 2006-10-11
  • 打赏
  • 举报
回复

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

反向查询一定不用。 像NOT IN 这种。
no_mIss 2006-10-11
  • 打赏
  • 举报
回复
现在可以确定:
IN(值列表)肯定用索引.
IN(子查询)这个还不清楚。
“子查询是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引
”怎么理解?谁给写个SQL示例说下,说完给分结贴。
lydmc 2006-10-09
  • 打赏
  • 举报
回复
可能跟统计等有关,Sql Server会从选择度等因素来判断用不用索引.
marco08 2006-10-09
  • 打赏
  • 举报
回复
學習...
dongxu0139 2006-10-09
  • 打赏
  • 举报
回复
关注,个人感觉not in是用不到索引的,in有时可以用到
no_mIss 2006-10-09
  • 打赏
  • 举报
回复
TO tx1icenhe(冒牌马可 V0.3)

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

我看了下执行计划,tablea中的id也用索引,和你说的不一致
tx1icenhe 2006-10-09
  • 打赏
  • 举报
回复
实际上:
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

执行,也会用到索引

tx1icenhe 2006-10-09
  • 打赏
  • 举报
回复
A in ()有两种形式

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



no_mIss 2006-10-09
  • 打赏
  • 举报
回复
等等等等..........
no_mIss 2006-10-09
  • 打赏
  • 举报
回复
可是执行计划中显示聚集索引的.
冷箫轻笛 2006-10-09
  • 打赏
  • 举报
回复
没试过
记得是不用的
no_mIss 2006-10-09
  • 打赏
  • 举报
回复
现在可以确定:
IN(值列表)肯定用索引.
IN(子查询)这个还不清楚。
“子查询是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引
”怎么理解?谁给说下,说完给分结贴。
no_mIss 2006-10-09
  • 打赏
  • 举报
回复
子查询是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引
这句话不理解,能不能举个sql语句说说啊,谢谢.
allright_flash 2006-10-09
  • 打赏
  • 举报
回复
sql中非子查询是用到索引的
子查询是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引
no_mIss 2006-10-09
  • 打赏
  • 举报
回复
To:allright_flash

那不用的情况说说看.
allright_flash 2006-10-09
  • 打赏
  • 举报
回复
in 可以用索引,可以不用索引,视情况而定。
no_mIss 2006-10-09
  • 打赏
  • 举报
回复
A in (子查询) 是用不到索引的,但是如果子查询的条件是和外层相关的,子查询本身用到索引
这句话不理解.

select * form table_a where id in (select id from table_a where id in (1,2))
这个从执行计划看都用索引.
fffddd 2006-10-09
  • 打赏
  • 举报
回复
以执行计划里看到的为准!

A in ()有两种形式

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

这个正确。
加载更多回复(1)

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧