Postgres:二级索引是否包含在 ACID 中?

Mar*_*tos 2 postgresql performance acid postgresql-performance

是涵盖非唯一索引/指数ç在onsistency条款Ç ID?(对于不限制数据的索引的其他属性也是如此)我在 Postgres 中看到了某些性能问题(实际上是好处),这让我想知道它们是否存在。

鉴于索引/索引不是一流的对象(即您不能直接在 Postgres 中访问它们,也不能请求使用它们),我完全看不出为什么需要 Postgres 来支持这一点。我找不到 ACID 的定义说“索引必须完全完成并且在事务完成之前不能被黑客攻击”。

在某些不对插入设置限制的条件下(例如索引不是唯一的),索引本质上可能是“无效的”(即“在我完成重新索引之前不要使用它”),或者标志可以是设置表示“该索引不涵盖以下范围”。

如果 Postgres 使用这个技巧,copy from操作符可以变得非常迅速(这就是我所看到的),对于事务中的大量插入计数也是如此。

我不只是编造这个...

虽然红移是一个坏榜样,亚马逊黄鼠狼出Ç由捉弄它是如何存储的(唯一)排序键(基本上在红移主索引十岁上下结构)onsistency。在执行vacuum命令之前,主键只会变得越来越糟糕,您的数据库开始变成一个黑洞:查询进入,但没有结果出来。

显然,内部化的真空方案将防止在大规模进口期间经常发生的 Redshift 愚蠢行为。

Cra*_*ger 5

aCid 的一致性条款是否涵盖非唯一索引/索引?

是的。任何违反此规定的行为都将被视为 PostgreSQL 中的错误。

您引用的文档是 postgres 可能必须临时扫描堆而不是仅执行索引扫描或以其他方式进行额外工作以获得一致结果的情况。

例如,BRIN 和 GIN 索引都会累积一批待处理的更改,然后进行批量更新。在查询中使用索引时,还会扫描此队列以确保看到当前的、最新的和一致的视图。

如果索引当前无效,规划器将跳过它,查询将不会使用它。

Redshift 并不是真正的 PostgreSQL,它只是碰巧共享相同的前端和协议。基于 Redshift 进行比较通常只会造成混淆。

  • @MarkGerolimatos Redshift 不是 PostgreSQL。它的后端完全不同。 (2认同)
  • @MarkGerolimatos 批量插入会增加索引(更多 I/O)并导致 I/O 争用。他们也倾向于争夺高速缓存。批量更新会使索引膨胀,创建可能仍需要读取的死页。堆上的死页也是如此。因此预计会出现减速,但不会与锁定相关。查阅 PostgreSQL 文档中的 MVCC 章节。是的,可以跳过无效索引,但在正常情况下索引不会变为无效。 (2认同)