我在A表在建立了一个主键(列名为AGuid,Guid类型)和一个聚集索引(列名为CreateTime,DateTime类型)B表为A表的外表,在列AGuid上建了一个索引(非聚集索引)执行以下语句Select * form a inner join b on a.AGuid=b.AGuid 为什么执行计划中,对A表采用聚集索引扫描?如果去掉聚集索引就成了表扫描了为什么用不上AGuid上的索引呢谢谢

解决方案 »

  1.   

    因为A表只有一个聚集索引,
    这样试试
    Select B.* form B inner join A on B.AGuid=A.AGuid 
      

  2.   

    有主键也不行吗?
    另外,如果我专门在A表的AGuid上建索引,查询计划也是一样的
      

  3.   

    我想问一下,这种inner join ,联接会用到索引的嘛?
      

  4.   

    这个要看数据, 如果走 AGUID 的扫描的数据页数量占数据页的比例比较大, 则走 AGuid 的索引是没有意义的, 因为扫描完索引还得去扫描数据, 这样两个扫描加起来访问的数据页可能还不如直接扫描数据页(走聚集索引).
      

  5.   

    所以楼主的语句, 理论上似乎是走 GUID 上的索引更有效.但涉及到实际数据时, 就还要结合数据进行分析在优化中, 基本上是要结合: 表结构(包括索引), 数据, 查询语句, 这三者来进行查询计划分析的, 缺一不可.
    这也是为什么大家很少会看到使用OPTION和WITH提示, 因为这些提示往往限制让查询使用一种较为固定的方法, 如果数据经常变化, 这种做法往往导致大部分情况下查询性能并不好.