【问题标题】:Impact of Dropping low selectivity indexes in oracle在 oracle 中删除低选择性索引的影响
【发布时间】:2019-06-08 07:39:52
【问题描述】:

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

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 的情况下删除低/高选择性索引的影响。 我们如何计算这些索引的唯一键值。谢​​谢!!

【问题讨论】:

    标签: oracle oracle11gr2


    【解决方案1】:

    在没有性能测试和/或不检查它们是否被使用的情况下删除这些索引是一个非常糟糕的主意。

    让我们尝试一个例子。假设我们有一张带有订单或其他东西的桌子。有一个程序会时不时地运行,它会轮询要处理的新记录。它按状态搜索。新订单的状态为 NEW。当它们被处理后,它们将获得状态 PROCESSED 或 REJECTED。换句话说,存在三个可能的值。假设有几百万条记录,通常有大约一百条状态为 NEW。

    如果删除通常对新记录非常有选择性的索引,轮询时间会发生什么情况?

    对于记录,我知道可以将 NULL 用于不应该被索引的记录,并且可以重新组织数据模型等等,但这是一个相当普遍的解决方案。只是删除索引会受到伤害。

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

    【讨论】:

      【解决方案2】:

      删除索引将是一种矫枉过正的做法,可能会对您的应用程序产生重大影响。 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 实际上是为了降低选择性 - 这就是它们的设计和最佳工作方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2013-09-22
        • 2011-06-17
        • 1970-01-01
        • 2011-01-24
        相关资源
        最近更新 更多