代码之家  ›  专栏  ›  技术社区  ›  Stephanie Page

非聚集索引的索引访问

  •  1
  • Stephanie Page  · 技术社区  · 14 年前

    如果我有两个数据表。一个是聚集索引CINDEX,另一个是堆。

    两者在同一列上都有一个非聚集索引SEARCHCOL

    假设聚集索引列的大小与rowid相同,因此两个非聚集索引的深度相同。

    a) SELECT * FROM CINDEX WHERE SEARCHCOL = :1
    
    b) SELECT * FROM HEAP WHERE SEARCHCOL = :1
    

    选择a或b

    1 回复  |  直到 14 年前
        1
  •  2
  •   Remus Rusanu    14 年前

    如果 Searchcol 如果有足够的选择性,则计划应该对非聚集索引(两者之间相同)执行预期的查找,然后查找聚集索引或堆,以便获得所有列,以满足 * 如果堆行未移动 . 如果堆行被移动,那么查找必须在新页上跟踪转发指针,这意味着一个新的逻辑读IO,依此类推,直到找到位置(如果它移动了多次)。因此,一般来说,堆将保存1-2个逻辑读取IOs(查找中seek的非叶部分)。

    Tipping Point 然后所有的赌注都被取消了,就像一个计划按键顺序进行聚集索引扫描,而另一个计划按分配顺序进行堆扫描一样(它们最终的IO大致相同)。

    但我必须警告,在决定heap和BTree时,这种细节度量(1-2页IOs)是不健康的。我的想法是 . 明确的原因通常是INSERT性能(这是堆围绕btree运行的地方),这意味着ETL数据加载场景,将数据加载到堆中以获得快速上载性能,然后将堆转换为聚集索引并使用开关操作添加到大事实表中。