环境:SqlServer2008R2
表名:member,其中有三个列a,b,c
复合索引1:on member(a,b)
复合索引2:on member(b,c)
查询语句:select top 10 * from member where b='yes'
从执行计划看,上面这个查询语句走的却是复合索引1,而不是走复合索引2

解决方案 »

  1.   

    表结构生成 sql 语句,连同执行计划发出来看看
      

  2.   

    我现在无法复原昨天半夜遇到的情况了,因为它这会总是走聚集索引扫描。
    那么就顺带求助一下大佬,为何它会走聚集索引扫描,而不走IX_kd_querytask_wlzt_checknum呢?
      

  3.   

    上面sql语句后面遮挡了,这里补充一下
    select top 10 * from kd_querytask where wlzt='dcx'
      

  4.   

    kd_querytask 这个表的总数据量是多少?
      

  5.   


    800万左右其实走不走索引, 不是由索引决定, 而是由 sqlserver 来决定。
    不是你建立了索引, sqlserver 就非得用。sqlserver决定用不用索引, 用哪个索引, 取决于它认为哪种方式消耗更小。打个比方:
    你是护士学校的校长, 学校里 99% 是女生, 学校有花名册(索引)上面写着学生及性别。
    现在集合开大会,你要想随便找 10 个女生出来, 是看花名册快, 还是随便在台下点10个人更快?回到你那个问题:
    select top 10 * from kd_querytask where wlzt='dcx'你想着sqlserver 为什么不走 wlzt 这个索引对不对?
    其实你首先要查一下比例:SELECT wlzt,COUNT(1) AS cnt 
    FROM kd_querytask
    GROUP BY wlzt
    ORDER BY cnt DESC