none
超级大表递增列上的聚集主键以递减的方式建立会不会影响性能 RRS feed

  • 问题

  • 对索引有一些想当然的问题,请教一下:

    一个大表,上亿的数据行,有一个聚集主键列是Bigint,数据是递增的,
    新数据肯定是越来越大,但是主键是以递减的方式建立的,
    即 create index ... (id desc)

    聚集索引基于数据行的键值在表内排序和存储这些数据行,即物理排序。
    聚集索引会不会在新数据来了后重新排序,即会不会导致
    原有数据的整行移动,因为数据库引擎 必须按物理顺序保留行中的数据值?
    这样的聚焦索引会不会引起性能下降?
    hello
    • 已编辑 Merrica 2009年9月27日 2:32 明确标题
    2009年9月25日 7:17

答案

  • 不会影响性能。不过建立单个字段的降序索引并没有意义。
    想不想时已是想,不如不想都不想。
    2009年9月27日 6:39
    版主
  • 看来各位大侠对这种情况是否影响性能也有不同的意见
    是不是还有需要讨论的地方?

    是否影响插入?影响更新?影响查询?
    hello

    性能不会因为索引升序还是降序而发生变化
    SQL SERVER Engine Test
    2009年9月28日 2:59
    版主

全部回复

  • Yes if you create pkey as clustered. In this case, create non-clustered pkey and put clustered index on proper column.
    2009年9月25日 13:24
  • 应该不会吧
    恐龙不懂
    2009年9月25日 13:51
  • 主键默认是聚集索引, 也就数据存储的顺序, 除非你有特别设置为非聚集
    所以是聚集的情况下, 一般不会, 因为数据是递增的, 除非你有强制插入影响顺序的主键值

    2009年9月26日 4:13
  • But OP said that pkey is created in desc order. 
    2009年9月26日 21:10
  • 看来没说清楚

    就是说 超级大表 的 递增列 上的聚集主键 以 递减 的方式建立,是不是有很大的性能上的影响?
    hello
    2009年9月27日 2:02
  • Will affect performance because there's data moving when insert new row.
    2009年9月27日 2:59
  • 不会导致原有数据的整行移动。

    那么SQL Server如何处理这种情形呢( clustered index,顺序如上描述)?
    1. 页间:数据页双向链表,从而避免页移动
    2. 页内:采用row offset array避免行移动

    我觉得唯一的一点代价是需要维护row offset array,这个对性能影响应该可以忽略。

    所以不用担心这样会对性能有影响。

    2009年9月27日 5:22


  • Row offect array负责维护数据行的逻辑顺序,数据行在数据页中的物理顺序跟索引的升降序没有关系,所以不会因为索引升降序而导致已经存在的数据移动.

     

    inside sqlserver storage engine的第六章有具体的内容


    SQL SERVER Engine Test
    2009年9月27日 6:18
    版主
  • 不会影响性能。不过建立单个字段的降序索引并没有意义。
    想不想时已是想,不如不想都不想。
    2009年9月27日 6:39
    版主
  • 看来各位大侠对这种情况是否影响性能也有不同的意见
    是不是还有需要讨论的地方?

    是否影响插入?影响更新?影响查询?
    hello
    2009年9月28日 2:50
  • 看来各位大侠对这种情况是否影响性能也有不同的意见
    是不是还有需要讨论的地方?

    是否影响插入?影响更新?影响查询?
    hello

    性能不会因为索引升序还是降序而发生变化
    SQL SERVER Engine Test
    2009年9月28日 2:59
    版主
  • 不会。据说还会提升性能。
    2009年9月28日 9:24