我们知道我们可以使用下面的公式来计算选择性:
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时,降低低/高选择性索引会有什么影响。我们如何计算这些索引的唯一键值.Thank你!!
发布于 2019-06-08 15:56:15
在不进行性能测试和/或不检查是否使用这些索引的情况下删除这些索引是一个非常糟糕的主意。
让我们来看一个例子。假设我们有一个表,里面有订单之类的东西。有一个程序会时不时地运行,轮询要处理的新记录。它按状态进行搜索。新订单的状态为NEW。当它们被处理时,它们的状态为已处理或被拒绝。换句话说,有三个可能的值。假设有几百万条记录,通常有大约100条状态为NEW的记录。
如果删除了通常对新记录非常有选择性的索引,那么轮询时间会发生什么?
对于记录,我知道对于不应该索引的记录可以使用NULL,并且可以重新组织数据模型等等,但这是一种非常常见的解决方案。仅仅是删除索引就会很痛苦。
总而言之,降低选择性指数的影响可能是一场灾难。它也可以正常工作,这取决于应用程序。一种更好的方法是启用监控,并查看是否实际使用了索引。
发布于 2019-06-08 18:03:55
删除索引将是一种过度的杀伤力,并可能对您的应用程序产生重大影响。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实际上是打算低选择性的--这就是它们的设计方式和工作方式。
https://stackoverflow.com/questions/56504487
复制相似问题