【问题标题】:Postgres - Why Index Only scans are required?Postgres - 为什么需要仅索引扫描?
【发布时间】:2020-07-26 14:30:53
【问题描述】:

我试图了解 Postgres 中的仅索引扫描。它说只执行索引扫描是因为普通索引(二级)执行两步查找,即索引没有附加完整的行,而是行标识符(ctid),磁盘上的物理位置,所以首先它找到行的使用索引列的物理位置,然后进入主表获取实际的行数据。

第二步不应该更快吗,因为它涉及直接进入行并获取数据,或者是否需要对主表执行顺序扫描以找到特定的 ctid,以及是否可以直接进入row 使用 ctid 那么为什么需要仅索引扫描?

【问题讨论】:

    标签: postgresql database-design database-indexes


    【解决方案1】:

    第二步不应该更快,因为它涉及直接进入行并获取数据

    对于硬盘驱动器,“直接”进入行需要等待物理读头臂寻找正确的柱面,并等待物理磁盘旋转到正确的偏移量。然后再下一行,再下一行。

    即使对于固态磁盘,它们也没有物理移动的延迟,但仍然比主内存或 CPU 缓存慢。

    【讨论】:

      【解决方案2】:

      仅当第一步返回多对多 ctid(找到许多结果)时,第二步可能会很慢。因此,仅索引扫描在结果非常大并且可以直接从索引中获取而无需去其他地方获取真实数据时很有用。

      【讨论】:

      • .. 由于表数据碎片,第二步可能会很慢(对于大表和第一步的多个结果)
      【解决方案3】:

      第二步耗费资源

      • (也许)从磁盘获取整个 8K 页面
      • 其中(可能)只需要几个字节
      • 为结果元组分配缓冲空间
      • (可能)锁定页面或元组
      • 之后进行额外清理

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-25
        • 2015-01-27
        • 2021-06-23
        • 1970-01-01
        相关资源
        最近更新 更多