oracle中低基数高更新列应该创建什么索引?

What index should be created for low cardinality high updating columns in oracle?

例如,在 Oracle 11g 中,我有一个 table Task,其中有一列 ProcessState。此列的值可以是 QueuedRunningComplete(将来可以有更多状态)。 table 将包含 50M+ 数据,其中 99.9% 的行具有 Complete 作为该列值。只有几千行的值是 Queued/Running

我读到虽然 bitmap 索引适用于低基数列,但它主要用于静态 tables。

那么,什么索引可以改善Queued/Running任务的查询呢? bitmap 或正常的非唯一 b-tree 索引?

此外,什么索引可以改进二进制列的查询(NUMBER(1,0),只有 yes/no 个值)?

免责声明:我是一个偶然的dba。

我猜您有兴趣选择具有 (Queued/Running) 个状态的行来更新它们。因此,将已完成的行与其他行分开 会很好,因为索引已完成的行没有太多意义。您可以在此处使用 paritioningfunction-based index with function returning NULL for completed rows and actual values for others, in this只有未完成的行出现在索引树中的情况。

常规 (b*tree) 索引就可以了。只要确保列上有直方图即可。 (参见 DBMS_STATS.GATHER_TABLE_STATS 中的 METHOD_OPT 参数)。

有了该列的直方图,Oracle 将拥有它需要的数据,以确保它在查找 queued/running 作业时使用索引,但在查找已完成的作业时使用完整的 table 扫描.

不要不要使用位图索引,如评论中所建议的那样。如果有大量更新,您将遇到并发问题,更糟糕的是,还会出现死锁问题。

Also, what index can improve the query for a binary column (NUMBER(1,0) with just yes/no values)

抱歉 - 我错过了你问题的这一部分。如果列中的数据是倾斜的(即几乎全为 1 或几乎全为 0),则使用上述常规 (b*tree) 索引。如果数据是均匀分布的,那么任何索引都无济于事。通过索引读取 50% 的 table 行将比完整的 table 扫描慢。