在Oracle中删除低选择性索引的影响

时间:2019-06-08 07:39:52

标签: oracle oracle11gr2

我们知道我们可以使用以下公式计算选择性:-

Sql> Selectivity = Distinct Values / Total Number Rows;

Sql>

SELECT DISTINCT_KEYS, NUM_ROWS,(DISTINCT_KEYS/NUM_ROWS) AS SELECTIVITY,B.*
        FROM DBA_INDEXES B
        WHERE INDEX_NAME  IN('Idx1','Idx11','Idx2') 
        AND  OWNER NOT IN('SYS','SYSTEM');

在我的应用程序中,有许多具有唯一键值的索引分别是2、3、4或5,DBA希望删除这些索引。

任何机构都可以向我解释在唯一键值为2、3、4或5的情况下降低低/高选择性指数的影响。 我们如何为这些索引计算唯一键值。谢​​谢!

2 个答案:

答案 0 :(得分:2)

丢弃这些索引而不进行性能测试和/或不检查它们是否被使用是一个非常糟糕的主意。

让我们尝试一个例子。假设我们有一个包含订单或其他内容的表格。有一个程序不时运行,然后轮询要处理的新记录。它按状态搜索。新订单的状态为NEW。处理完后,它们的状态为已处理或已拒绝。换句话说,存在三个可能的值。假设有几百万条记录,通常状态为“ NEW”的记录约有一百条。

如果删除对新记录通常具有选择性的索引,那么轮询时间会怎样?

对于记录,我知道可以对不应该建立索引的记录使用NULL,并且可以对数据模型进行重组等等,但这在野外是相当普遍的解决方案。只是降低索引会很痛。

总而言之,降低低选择性指数的影响可能是一场灾难。它也可以很好地工作,取决于应用程序。更好的方法是启用监视并查看索引是否实际使用。

答案 1 :(得分:1)

删除索引可能会过大,并且可能会对您的应用程序产生重大影响。 Oracle为此提供了其他功能。

首先考虑INDEX MONITORINGIndex Usage Tracking(如果您已经运行12.2或更高版本)

删除索引的一种非常快速的替代方法是使其不可见:

ALTER INDEX ind_xyz INVISIBLE;

优化器看不到不可见的索引,即它不会用于任何查询或DML操作。请注意,您可以使用

在会话级别绕过此行为
ALTER SESSION SET OPTIMIZER_USE_INVISIBLE_INDEXES = TRUE;

如果将此参数设置为TRUE,则优化器将使用索引,而不管其可见性如何。默认值为FALSE

还应该提到BITMAP indexes实际上是选择性低的-这就是它们如何设计和最佳工作的方式。