1、你的[用户id]列是非聚集索引;如果该列为自增列,建议使用聚集索引
2、看执行计划,你本身有个聚集索引,但不知道是哪一列,如果聚集索引被占用,建议创建索引覆盖
create index idx_name on tb(col_name)
include(select中的列除去索引列)

解决方案 »

  1.   


    用户id 不是自增列,是可插入的字段
    聚集索引是本表的iid
      

  2.   


    你看第二张截图,中间已经提示了 缺少索引另外,执行select * from sys.dm_db_missing_index_details
    可以发现 索引  用户id 已经失效了啊
      

  3.   

    再补充一下
    我这个表 字段 iid,是pk,聚集索引
                     字段 用户id,int ,可插入重复值 ,非聚集索引
    现在 想查询 用户id=1的内容
    数据库执行计划提示 “缺少索引”u013226693  你看有什么解决方法吗?
      

  4.   

    我来说两句。首先经测试,因为是原来建的索引,不含include ,且select 字段很多,所以,即使重建原来的索引也无效。必须要建含include的索引,才不会出现“失效”。那为什么会出现失效呢?我觉得有两个原因:
    1、当然还是没有include,虽然先按“用户ID”索引查找了,但是还要查那些非索引字段,还要通过聚集索引再定位到数据行才能查出。比如你只select iid,用户id,这两个已是索引字段,其他字段不查,那么绝对不会报“失效”。这就是include关键字出现的用处。
    2、查出的结果集占总数据集比例过大,如何测试?你插入2、3条用户id=999999的记录,查这id,就不会报“失效”。这一点,应该就是“选择性原则”吧。
      

  5.   

    问题已解决,确实include可以解决失效问题
    谢谢各位啦
      

  6.   


    你看第二张截图,中间已经提示了 缺少索引另外,执行select * from sys.dm_db_missing_index_details
    可以发现 索引  用户id 已经失效了啊你看下面那个执行计划提示缺失的索引,实际索引列不变,只是要你加上include去实现索引覆盖;
    其实从第一个执行计划就能看出来,键查找,是由于索引列中未包含全部output的列,所以需要从非聚集索引的叶子页获取聚集键,再导向聚集索引中获取其他键值;