表t上的字段a和字段b还有字段c上建一个复合索引,
听说sql2005有个新的索引技术,只要查询条件出现'字段b'  or '字段c' or '字段a'就能用到这个复合索引,
如:
1,select * from t where a='xxx';
2,select * from t where b='xxx';
3,select * from t where c='xxx';
这三句都能用到该复合索引,不存在索引覆盖问题.

includ 索引?
请问:这个新的索引技术怎么用及注意事项,最好还能给段代码.

解决方案 »

  1.   

    create table tb(a int, b int, c int)
    create index idx_a on tb(a) include(b,c)
    drop table tb
      

  2.   

    --这样会用到覆盖索引
    select a,b,c from tb where a='xxx'
      

  3.   

    http://www.blue1000.com/bkhtml/2006-08/45511.htm另外,SQL SERVER 2005好像支持在线索引!去GOOGLE看一下
      

  4.   

    复合索引只针对你查询列为a,b,c且条件为a的情况下效果最明显
    语句1能利用到索引
    2,3貌似不行
      

  5.   

    楼主说的是带有包含性列的索引
    这个新的索引技术并不能实现楼主上面写的功能.
    该索引包含键列和非键列
    例如
    USE AdventureWorks;
    GO
    SELECT  City, StateProvinceID, PostalCode
    FROM Person.Address
    WHERE PostalCode BETWEEN N'98000' and N'99999';
    所以好的索引设计应该将 PostalCode 定义为键列并包含作为非键列的所有其他列。 下面的语句创建了一个覆盖查询的带有包含性列的索引。 USE AdventureWorks;
    GO
    CREATE INDEX IX_Address_PostalCode       
    ON Person.Address (PostalCode)       
    INCLUDE ( City, StateProvinceID);       
     
      

  6.   


    不知道你的用到这个复合索引是什么样的概念..
    使用索引可以分两种.一种是索引扫描.一种是索引查找.
    显然索引查找比索引扫描快很多.能不能使用上这个复合索引..
    如果不考虑数据密度,数据分布,以及列覆盖性(因为你是SELECT *,而不是具体哪些列)等因素1.是可以使用上索引查找.
    2.3.可能会用上索引扫描.然后通过book找到不在这个索引上的其它列的数据.
      但也可能会用不上.如果优化器认为这样的成本很高.那就直接在表里扫描.所以考虑的因素比较多.
      

  7.   

    从实现来看,按a,b,c建立的索引,order by b、order by c是很难使用的