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

时间:2016-02-22 15:09:54

标签: database oracle oracle11g database-administration database-indexes

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

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

那么,什么索引可以改进Queued / Running任务的查询? bitmap或普通的非唯一b-tree索引?

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

免责声明:我是一个意外的dba。

2 个答案:

答案 0 :(得分:1)

我猜你有兴趣选择具有(排队/运行)状态的行来更新它们。因此,将已完成的行与其他行分开会很好因为索引已完成的行没有太多意义。您可以在此使用 paritioning 基于函数的索引,其函数返回NULL表示已完成的行和其他的实际值,在这种情况下,只有未完成的行显示在索引树。

答案 1 :(得分:1)

常规(b *树)索引很好。只需确保列上有直方图。 (请参阅METHOD_OPT中的DBMS_STATS.GATHER_TABLE_STATS参数。)

在该列上有一个直方图,Oracle将获得所需的数据,以确保它在查找排队/正在运行的作业时使用索引,但在查找已完成的作业时使用全表扫描。

NOT 使用位图索引,如评论中所建议的那样。通过大量更新,您将获得并发性,更糟糕的是,会出现死锁问题。

  

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

抱歉 - 我错过了你的这部分问题。如果列中的数据是倾斜的(即,几乎全部为1或几乎全部为0),则为如上所述的常规(b *树)索引。如果数据均匀分布,那么没有索引会有所帮助。通过索引读取表的50%的行将比全表扫描慢。