再看下面的三个写法:
SELECT * FROM [Table] WHERE id = 1 or id = 2
SELECT * FROM [Table] WHERE id IN (1,2)
SELECT * FROM [Table] WHERE id = 1 UNION SELECT * FROM [Table] WHERE id = 2
我可以很负责的告诉你:都用索引。
第二种写法MSSQL会自动优化为:id = 1 or id = 2 ,而不会全表扫描下面这个写法:
SELECT * FROM [Table] WHERE id NOT IN (1,2)
我也可以很负责的告诉你:用索引。本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/no_mIss/archive/2006/10/09/1327771.aspx
-------------------------------------------------------------------------------------------用UNION 替换OR (适用于索引列)
通常情况下, 用UNION 替换WHERE 子句中的OR 将会起到较好的效果. 对索引列使用OR 将造
成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column 没有被索引, 查询效
率可能会因为你没有选择OR 而降低.
....
上面2个说法 哪个队阿
SELECT * FROM [Table] WHERE id = 1 or id = 2
SELECT * FROM [Table] WHERE id IN (1,2)
SELECT * FROM [Table] WHERE id = 1 UNION SELECT * FROM [Table] WHERE id = 2
我可以很负责的告诉你:都用索引。
第二种写法MSSQL会自动优化为:id = 1 or id = 2 ,而不会全表扫描下面这个写法:
SELECT * FROM [Table] WHERE id NOT IN (1,2)
我也可以很负责的告诉你:用索引。本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/no_mIss/archive/2006/10/09/1327771.aspx
-------------------------------------------------------------------------------------------用UNION 替换OR (适用于索引列)
通常情况下, 用UNION 替换WHERE 子句中的OR 将会起到较好的效果. 对索引列使用OR 将造
成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column 没有被索引, 查询效
率可能会因为你没有选择OR 而降低.
....
上面2个说法 哪个队阿
2、如果or运算符中引用的任何一列上都没有索引或索引没有用,就始终执行表扫描或聚集索引扫描
表[Table]
字段[id] INT PRIMARY KEY 聚集索引以下写法:
SELECT * FROM [Table] WHERE id = 1
肯定用索引对吧。再看下面的三个写法:
SELECT * FROM [Table] WHERE id = 1 or id = 2
SELECT * FROM [Table] WHERE id IN (1,2)
SELECT * FROM [Table] WHERE id = 1 UNION SELECT * FROM [Table] WHERE id = 2
我可以很负责的告诉你:都用索引。
第二种写法MSSQL会自动优化为:id = 1 or id = 2 ,而不会全表扫描下面这个写法:
SELECT * FROM [Table] WHERE id NOT IN (1,2)
我也可以很负责的告诉你:用索引。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/no_mIss/archive/2006/10/09/1327771.aspx
通常情况下, 用UNION 替换WHERE 子句中的OR 将会起到较好的效果. 对索引列使用OR 将造
成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column 没有被索引, 查询效
率可能会因为你没有选择OR 而降低. 在下面的例子中, LOC_ID 和REGION 上都建有索引.
高效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10
UNION
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE REGION = “MELBOURNE”
低效:
SELECT LOC_ID , LOC_DESC , REGION
FROM LOCATION
WHERE LOC_ID = 10 OR REGION = “MELBOURNE”
如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.
有些其他数据库,以及Sql server6.5或者以前版本,可能有第二个的说法
ps:优化的文章很多是个人经验,有些理解和表述并不一定很准确,自己需要测试来区别,测试永远是最能说明问题的
剪剪 SELECT * FROM [Table] WHERE id = 1 or id = 2 这句用到了索引通常情况下, 用UNION 替换WHERE 子句中的OR 将会起到较好的效果. 对索引列使用OR 将造
成全表扫描.这2句 是否冲突啊他们要是有区别 在于 左右2列是否相同了
我可以理解为 如果是同一列索引列 如果用OR那么还是用到了索引
如果OR两边的索引列不一样 就失去索引效果?
并不是说or的性能就一定比union低多少
我也可以很负责的告诉你:用索引。应该是SELECT * FROM [Table] WHERE id NOT IN (1,2)
我也可以很负责的告诉你:可以用索引查找。
试下NOT IN 超过三个值..
值小于等于2个的时候.sql server会优化为一个区间的查找.
以前用2000的时候,or好像会整表扫描的,而union一定会用索引.
create table tb(id int, col varchar(100))
go
create index ix_id on tb(col)
godeclare @i int
set @i=1while @i<1000
begin
insert tb select @i,newid()
set @i=@i+1
endselect * from tb where id not in (1,2,100)drop table tb
10W条记录,not in (1,N)总是查找,我改成 not in (2,3)就是扫描了这么多记录,不知道它查找个什么?!
书也不一定就全是 对的有的人说 用in 用不到索引 有的说用得到就好用like一样 有的人说用不到索引,但是有多人又是用的到郁闷 哦!~~~~~
如果用聚集索引的话
其实用in和not in都会是索引查找if object_id('temp') is not null
drop table temp
create table temp(id int identity(1,1) primary key,[name] varchar(50))
go
insert into temp values('test')
go 100--下面的查找全部用了聚集索引查找select * from temp where id in(1,2)select * from temp where id not in(1,2)欢迎拍砖