在Oracle 11g中,我说有一个表Task
,其中有一列ProcessState
。此列的值可以是Queued
,Running
和Complete
(将来可能会有更多状态)。该表将具有50M +数据,其中99.9%的行具有Complete
作为该列值。只有几千行的值为Queued
/ Running
。
我读到虽然bitmap
索引适用于低基数列,但主要用于静态表。
那么,什么索引可以改进Queued
/ Running
任务的查询? bitmap
或普通的非唯一b-tree
索引?
此外,什么索引可以改进二进制列的查询(NUMBER(1,0)
只有yes
/ no
值?)
免责声明:我是一个意外的dba。
答案 0 :(得分:1)
我猜你有兴趣选择具有(排队/运行)状态的行来更新它们。因此,将已完成的行与其他行分开会很好因为索引已完成的行没有太多意义。您可以在此使用 paritioning 或基于函数的索引,其函数返回NULL
表示已完成的行和其他的实际值,在这种情况下,只有未完成的行显示在索引树。
答案 1 :(得分:1)
常规(b *树)索引很好。只需确保列上有直方图。 (请参阅METHOD_OPT
中的DBMS_STATS.GATHER_TABLE_STATS
参数。)
在该列上有一个直方图,Oracle将获得所需的数据,以确保它在查找排队/正在运行的作业时使用索引,但在查找已完成的作业时使用全表扫描。
NOT 使用位图索引,如评论中所建议的那样。通过大量更新,您将获得并发性,更糟糕的是,会出现死锁问题。
此外,什么索引可以改进二进制列的查询(NUMBER(1,0)只有是/否值)
抱歉 - 我错过了你的这部分问题。如果列中的数据是倾斜的(即,几乎全部为1或几乎全部为0),则为如上所述的常规(b *树)索引。如果数据均匀分布,那么没有索引会有所帮助。通过索引读取表的50%的行将比全表扫描慢。