2017-08-25 99 views
0

我有一个真正巨大的表X.这张表中每天插入100万个recods。我必须在表格的其中一列上添加一个索引。但是,如果我这样做,可能会发生以下影响。oracle数据库:索引超过记录的10%

  1. 插入,更新,删除可能很慢。
  2. 额外的磁盘空间。
  3. 索引将针对每个DML语句进行更新。
  4. 无法预料的问题。
  5. 已经有许多其他指标存在于表X.

所以我不会指数增加任何价值,反而会制造更多的麻烦。

我已经想到了一个办法来摆脱这种局面。 但我不知道它是否可以实现。请建议。

我想创建一个只对表中的前10%的记录索引。 而且这个查询应该保持在将来也只有它的10%。

+0

将您的数据分解为两个表格,最近和旧的。将索引添加到旧数据。 –

+0

你的桌子是否被划分了? –

+0

您可能需要指定“前10%记录”的含义。你如何确定哪些记录在前10%? –

回答

2

如果你的表是真的很“庞大”(在我的应用程序一个我加每天1十亿行),那么你应该使用分区。我认为你的大部分问题都将由此解决。

其实我的答案是无效的,你不使用分区和使用石器时代的Oracle 10g,但是我告诉你啦。

在版本12C甲骨文推出Partial Indexes for Partitioned Tables。使用此功能,您可以在单个分区上定义索引。

语法是这样的:

CREATE INDEX MY_INDEX ON MY_TABLE (IND_COLS) INDEXING PARTIAL; 

也可以打开/关闭索引上现有的索引:

ALTER INDEX MY_INDEX INDEXING PARTIAL/FULL; 

然后你可以禁用/重建每个分区索引像

ALTER INDEX MY_INDEX MODIFY PARTITION P_123 UNUSABLE; 
ALTER INDEX MY_INDEX REBUILD PARTITION P_123; 

索引是由表分区控制的,因此在创建任何索引之前,您应该将default设置为off,o无论每个新创建的分区将有“索引开”。

ALTER TABLE MY_TABLE MODIFY DEFAULT ATTRIBUTES INDEXING OFF;