Oracle:在没有索引的表中识别重复项

Vj_*_*_in 6 oracle plsql duplicates

当我尝试在大型表上创建唯一索引时,我得到一个独特的约束错误.在这种情况下,唯一索引是4列的复合键.

是否有一种有效的方法来识别除以下之外的重复项:

select col1, col2, col3, col4, count(*)
from Table1
group by col1, col2, col3, col4
having count(*) > 1
Run Code Online (Sandbox Code Playgroud)

上面的解释计划显示了具有极高成本的全表扫描,并且只想找到是否有其他方法.

谢谢 !

Jef*_*tin 7

首先尝试在这四列上创建一个非唯一索引.这将花费O(n log n)时间,但也将减少执行select到O(n log n)所需的时间.

你在这里有点绑定 - 无论你怎样切片,整个表必须至少读一次.天真算法在O(n 2)时间内运行,除非查询优化器足够聪明以构建临时索引/表.

  • 解决非唯一问题后,可以使用已创建的非唯一索引强制执行唯一约束.当您在同一列上具有非唯一索引时,它不会让您创建唯一索引,因此如果您真的想要一个唯一索引,请在table1上创建非唯一索引作为create index t_ix(col1,col2,col3 ,col4,1); 最后使用文字,它不会阻止您稍后在col1,col2,col3,col4上创建唯一索引,然后删除非唯一索引 (3认同)