none
非聚集主键,怎么创建include列 RRS feed

  • 问题

  • select * from xxx where guid='xxxxx' 

    guid是一个非聚集的主键,而表的聚集索引是一个createtime

    执行计划每次都会走两个索引,一个是seek主键的索引,另一个是key lookup聚集索引(走聚集索引并发高了会有严重的共享锁问题)

    我想重新创建主键,并且加上include所有列,这样理论上就只会走seek主键的索引。但是

    ALTER TABLE XXX add constraint PK_XXX_Guid  primary KEY NONCLUSTERED (guid) INCLUDE (...)

    不支持这种语法

    2020年1月15日 2:30

答案

  • 聚集索引一定是包含所有列的,因为聚集的意思就是数据存储的顺序

    所以不管你按照那个列创建聚集索引,它都 INCLUDE 所有列

    至于你的日期查询,单独建立日期索引就行了吧,两份数据的设计对数据变更的速率影响会比较大

    2020年1月17日 0:48

全部回复

  • 创建唯一索引可以解决问题,但是这样会导致表没有主键
    2020年1月15日 2:36
  • 你是否可以把Createtime的聚集索引drop掉,然后再guid上创建聚集索引的主键呢?这样就只走seek主键的索引了吧。

    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.

    2020年1月15日 7:59
  • 你是否可以把Createtime的聚集索引drop掉,然后再guid上创建聚集索引的主键呢?这样就只走seek主键的索引了吧。

    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.

       当然不行,如果非聚集主键不支持INCLUDE的话,只能再单独建一个include所有列的唯一索引,这样的话主键就是鸡肋,基本上执行计划只会走我创建的唯一索引了,主键就没啥意义了占空间而已
    2020年1月15日 8:05
  • 楼主这样相当于两份数据了,为啥不直接 guid 为聚集主键?
    2020年1月16日 0:55
  • 楼主这样相当于两份数据了,为啥不直接 guid 为聚集主键?
        因为业务需求经常有按创建日期范围查询因此修改的聚集索引,聚集索引默认都include所有列,但是发现非聚集主键并不是这样,如果创建主键不支持include的话,只能创建个唯一索引保存两份数据了
    2020年1月16日 2:45
  • 聚集索引一定是包含所有列的,因为聚集的意思就是数据存储的顺序

    所以不管你按照那个列创建聚集索引,它都 INCLUDE 所有列

    至于你的日期查询,单独建立日期索引就行了吧,两份数据的设计对数据变更的速率影响会比较大

    2020年1月17日 0:48