none
索引都提示包含性列,我不知道怎么建索引了 RRS feed

  • 问题

  • 发现个问题。以下三个字段取的值均位于记录前面,不知这个是否有影响

    sql05,以下索引均为非聚焦。字段

    Start    float    有很多0
    [End]    float    有很多0
    IP    varchar(50)    有很多null

    原SQL,计划不提示有优化:

    SELECT Country  T_IP WHERE (@ip1>=[Start] AND @ip1<=[End]) or IP=@ip

    改后的SQL

    SELECT Country FROM T_IP WHERE (@ip1>=[Start] AND @ip1<=[End]) union
    SELECT Country FROM T_IP WHERE IP=@ip

    计划提示建两个索引

    ON [dbo].[T_IP] ([Start],[End]) INCLUDE ([Country])
    
    ON [dbo].[T_IP] ([IP]) INCLUDE ([Country])

    这个表似乎要求所查的字段都包含在性列中,所查字段和where条件字段对索引关联及强。以下附测试

    未建任何索引,这个把所有字段包含在性列了

    SELECT * FROM T_IP WHERE ip=@ip ON [dbo].[T_IP] ([IP]) INCLUDE ([ID],[Tel_ID],[Start],[End],[IP_Province],[Country],[IP_County],[City],[BlackFlag],[Info],[Crdate])


    确定已按IP建立了索引,仅加了个where字段(之前的表这种情况会走IP索引)
    SELECT ip  FROM T_IP WHERE ip=@ip and Tel_ID = 1
    
    ON [dbo].[T_IP] ([Tel_ID],[IP])



    2015年6月8日 9:15

答案

  • 满足条件的数据占总数据量的多少? 如果很多, 那么不走索引是正常的, 当然, 如果总数据量很少, 不走索引也不奇怪
    2015年6月8日 10:12

全部回复

  • 缺失索引的那个建议,是按照当前查询最优化的方式, 所以多数时候都有大量 include 列, 正常建索引一般只包含条件上选择性高的列, 并不是要严格按照建议的那个去建索引的
    2015年6月8日 9:29
  • 建G,建有如下两个索引。原SQL和union SQL(顶上有)在计划中都显示不走索引。花销时间和无索引是一样的,该怎么优化呢

    ON [dbo].[T_IP] ([Start],[End])

    ON [dbo].[T_IP] ([ip])

    2015年6月8日 9:53
  • 满足条件的数据占总数据量的多少? 如果很多, 那么不走索引是正常的, 当然, 如果总数据量很少, 不走索引也不奇怪
    2015年6月8日 10:12
  • You are better to modify your query as following then check plan again:

    SELECT Country  T_IP WHERE ([Start] <= @ip1 AND [End] >= @ip1) or IP=@ip

    2015年6月8日 13:21