我们知道我们可以使用以下公式计算选择性:-
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的情况下降低低/高选择性指数的影响。 我们如何为这些索引计算唯一键值。谢谢!
答案 0 :(得分:2)
丢弃这些索引而不进行性能测试和/或不检查它们是否被使用是一个非常糟糕的主意。
让我们尝试一个例子。假设我们有一个包含订单或其他内容的表格。有一个程序不时运行,然后轮询要处理的新记录。它按状态搜索。新订单的状态为NEW。处理完后,它们的状态为已处理或已拒绝。换句话说,存在三个可能的值。假设有几百万条记录,通常状态为“ NEW”的记录约有一百条。
如果删除对新记录通常具有选择性的索引,那么轮询时间会怎样?
对于记录,我知道可以对不应该建立索引的记录使用NULL,并且可以对数据模型进行重组等等,但这在野外是相当普遍的解决方案。只是降低索引会很痛。
总而言之,降低低选择性指数的影响可能是一场灾难。它也可以很好地工作,取决于应用程序。更好的方法是启用监视并查看索引是否实际使用。
答案 1 :(得分:1)
删除索引可能会过大,并且可能会对您的应用程序产生重大影响。 Oracle为此提供了其他功能。
首先考虑INDEX MONITORING或Index Usage Tracking(如果您已经运行12.2或更高版本)
删除索引的一种非常快速的替代方法是使其不可见:
ALTER INDEX ind_xyz INVISIBLE;
优化器看不到不可见的索引,即它不会用于任何查询或DML操作。请注意,您可以使用
在会话级别绕过此行为ALTER SESSION SET OPTIMIZER_USE_INVISIBLE_INDEXES = TRUE;
如果将此参数设置为TRUE
,则优化器将使用索引,而不管其可见性如何。默认值为FALSE
还应该提到BITMAP indexes实际上是选择性低的-这就是它们如何设计和最佳工作的方式。