再看下面的三个写法:
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个说法 哪个队阿

解决方案 »

  1.   

    查了一下微软的书;1、查询分析器会自动把in转化为or运算符
    2、如果or运算符中引用的任何一列上都没有索引或索引没有用,就始终执行表扫描或聚集索引扫描 
      

  2.   

    问题完善下 前提:
    表[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
      

  3.   

    我只想知道什么情况下UNION ALL会比OR快
      

  4.   

    用UNION 替换OR (适用于索引列)
    通常情况下, 用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, 那就需要返回记录最少的索引列写在最前面.
      

  5.   

    SELECT * FROM [Table] WHERE id = 1 or xxx= 2 --------这种情况下可以考虑
      

  6.   

    如果or来or区都是一个字段当然直接or好了,如果是不同字段再加上各种字段被索引的可能你就需要借助查询计划来衡量速度了
      

  7.   

    对于目前的版本的Sql server,第一个对
    有些其他数据库,以及Sql server6.5或者以前版本,可能有第二个的说法
    ps:优化的文章很多是个人经验,有些理解和表述并不一定很准确,自己需要测试来区别,测试永远是最能说明问题的
      

  8.   


    剪剪 SELECT * FROM [Table] WHERE id = 1 or id = 2 这句用到了索引通常情况下, 用UNION 替换WHERE 子句中的OR 将会起到较好的效果. 对索引列使用OR 将造
    成全表扫描.这2句 是否冲突啊他们要是有区别 在于 左右2列是否相同了
    我可以理解为 如果是同一列索引列 如果用OR那么还是用到了索引
    如果OR两边的索引列不一样 就失去索引效果?
      

  9.   

    但是你不要忘记union带来的distinct效果而损失的性能。如果返回数据很多,相当不合算
      

  10.   

    这些都要看情况来说话的
    并不是说or的性能就一定比union低多少
      

  11.   

    那是我刚学sql server时写的文章SELECT * FROM [Table] WHERE id NOT IN (1,2)
    我也可以很负责的告诉你:用索引。应该是SELECT * FROM [Table] WHERE id NOT IN (1,2)
    我也可以很负责的告诉你:可以用索引查找。
      

  12.   


    试下NOT IN 超过三个值..
    值小于等于2个的时候.sql server会优化为一个区间的查找.
      

  13.   

    not in里如果是子查询的话,也不能用到index seek的.
      

  14.   

    在2005以上版本,三种方法都会用到索引.
    以前用2000的时候,or好像会整表扫描的,而union一定会用索引.
      

  15.   

    not in 总是表扫描(table scan),而不是索引查找(index seek),两个版本我都试了。
    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
      

  16.   


    10W条记录,not in (1,N)总是查找,我改成 not in (2,3)就是扫描了这么多记录,不知道它查找个什么?!
      

  17.   


    书也不一定就全是 对的有的人说 用in 用不到索引 有的说用得到就好用like一样 有的人说用不到索引,但是有多人又是用的到郁闷 哦!~~~~~
      

  18.   

    你对列进行的是非聚集索引
    如果用聚集索引的话
    其实用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)欢迎拍砖
      

  19.   

    是这样。如果是聚集索引,not in 超过2个值时,在SQL 2000是聚集索引索引查找,而在SQL 2005 是聚集索引索引扫描。