oracle中低基数高更新列应该创建什么索引?
What index should be created for low cardinality high updating columns in oracle?
例如,在 Oracle 11g 中,我有一个 table Task
,其中有一列 ProcessState
。此列的值可以是 Queued
、Running
和 Complete
(将来可以有更多状态)。 table 将包含 50M+ 数据,其中 99.9% 的行具有 Complete
作为该列值。只有几千行的值是 Queued
/Running
。
我读到虽然 bitmap
索引适用于低基数列,但它主要用于静态 tables。
那么,什么索引可以改善Queued
/Running
任务的查询呢? bitmap
或正常的非唯一 b-tree
索引?
此外,什么索引可以改进二进制列的查询(NUMBER(1,0)
,只有 yes
/no
个值)?
免责声明:我是一个偶然的dba。
我猜您有兴趣选择具有 (Queued/Running) 个状态的行来更新它们。因此,将已完成的行与其他行分开 会很好,因为索引已完成的行没有太多意义。您可以在此处使用 paritioning 或 function-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 扫描慢。
例如,在 Oracle 11g 中,我有一个 table Task
,其中有一列 ProcessState
。此列的值可以是 Queued
、Running
和 Complete
(将来可以有更多状态)。 table 将包含 50M+ 数据,其中 99.9% 的行具有 Complete
作为该列值。只有几千行的值是 Queued
/Running
。
我读到虽然 bitmap
索引适用于低基数列,但它主要用于静态 tables。
那么,什么索引可以改善Queued
/Running
任务的查询呢? bitmap
或正常的非唯一 b-tree
索引?
此外,什么索引可以改进二进制列的查询(NUMBER(1,0)
,只有 yes
/no
个值)?
免责声明:我是一个偶然的dba。
我猜您有兴趣选择具有 (Queued/Running) 个状态的行来更新它们。因此,将已完成的行与其他行分开 会很好,因为索引已完成的行没有太多意义。您可以在此处使用 paritioning 或 function-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 扫描慢。