Насколько я могу судить, ваш запрос будет выполняться медленно
Это должно дать вам лучшую производительность
delete t1
from tab1 t1
join tab1 t2
on t1.rowid > t2.rowid
and t1.col1 = t2.col1
and t1.col2 = t2.col2
Или вот это (работает на mssql, я думаю, что у Oracle естьтот же синтаксис)
;WITH [CTE DUPLICATE] AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY id) RN
FROM tab1
)
DELETE FROM [CTE DUPLICATE] WHERE RN > 1