none
有关建立索引键列与包含性列疑问 RRS feed

全部回复

  • 包含列不会排序,不会存储在非叶级页上,没有900字节限制

    目的是避免到表中去seek非索引字段值


    SQL Server 2016 ~ 2000 性能优化、方案设计 QQ:315054403 田园嘉兴

    2018年1月13日 15:45
  • Hi shuai7boy,

     

    包含性列和索引键列有很大的区别,当我们创建索引的时候,我们需要指定一个列,然后按照这个列的数据进行排序,那么这个我们指定的列就是索引键列,而包含性列其实就是T-SQL中的include,用以包含那些你想和索引列数据一起放到索引中的数据,这些数据只会存储在叶级别。我们可以看一下下面这张图:

     

     

    SQL Server通过索引查找已经被include的非索引列的数据的时候,比方说,如上图所示,我们有个班级学生的信息表,我们以姓名作为索引列,然后includeIDfield,那么这两个列也会存储到索引的叶级别上。当我们使用 select ID from T where name = ***这类的查询的时候,SQL Server会通过索引找到相应的name,然后直接获取存在叶级别上的ID数据就可以了,如果不include这个ID列的话,就要多一个seek的步骤去原来的物理表中去找,而seek这个步骤是要避免的。

     

    这里有一篇博客,你可以参考一下: https://www.cnblogs.com/gaizai/archive/2010/01/11/1644358.html

     

    Best Regards,

    Teige

     


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年1月15日 8:29
    版主
  • 如果觉得回答看不懂的话。

    要点如下:

    where后面的列最好放在索引键列里,select里的列(没有出现在where后面)最好放在包含性列里。

    注意:只是最好,不是一定。


    想不想时已是想,不如不想都不想。

    2018年1月16日 9:46
    版主