Oracle 在delete语句中使用rowid

Oracle 在delete语句中使用rowid,oracle,sql-delete,Oracle,Sql Delete,使用rowid是否有任何严重的禁忌症需要删除 DELETE FROM NETATEMP.SFAC_TESTATA_CASISTICHE WHERE ROWID IN ( SELECT MIN (ROWID) FROM NETATEMP.SFAC_TESTATA_CASISTICHE GROUP BY ID_CASO, DESC

使用rowid是否有任何严重的禁忌症需要删除

DELETE FROM NETATEMP.SFAC_TESTATA_CASISTICHE
      WHERE ROWID IN (  SELECT MIN (ROWID)
                          FROM NETATEMP.SFAC_TESTATA_CASISTICHE
                      GROUP BY ID_CASO,
                               DESCRIZIONE_TECNICA,
                               DESCRIZIONE_ANALISI,
                               PDF,
                               SCARTI,
                               DATA_INIZIO_ANALISI,
                               DATA_FINE_ANALISI,
                               DATA_INSTRADAMENTO,
                               DATA_RISOLUZIONE,
                               STRINGA_RICERCA,
                               SETTIMANA,
                               DATA_INIZIO_SETT,
                               DATA_FINE_SETT,
                               FATTURAZIONE,
                               IN_ELABORAZIONE
                        HAVING COUNT (1) > 1);

有几件事需要注意。您似乎依赖于rowid为特定分组提供最早的行选择minrowid。。。。这并不总是真的。确保删除最早记录的唯一方法是使用一些列(如时间戳),您可以根据这些列进行排序。比我能做的更好

rowid只表示行的物理位置。 它并不意味着年龄、插入顺序或诸如此类的东西

此外,根据表的大小,您将生成大量的重做/撤消操作,在大型表中,使用pl/sql进行分块删除和每x行提交可能是有益的

只是我的想法

如果假设minrowid返回最早的行,那么是的,您有问题,因为它不会返回


如果您只使用minrowid获取其中一个副本,而不关心哪个副本,那么不,该语句没有任何错误。

您是否假设较低的rowid是较早的记录min?@tbone:不,这些记录是相同的。谁先创造出来并不重要。我经常使用min来选择一条随机记录。与在单个事务中删除记录相比,分块删除会产生更多的重做和撤消操作。这是一个古老的神话,20年前不是真的,现在也不是。我的观点不是减少总体重做,而是更好地控制它。我曾经遇到过几个案例,其中一个大的删除运行了几个小时,然后DBA不得不终止它,回滚所有内容所需的时间花费了很长时间。对于大的删除,这是一种更好的处理db环境的方法,可以减少DBA的烦恼;-。如果需要,更容易停止/重新启动。不管怎么说,这只是我的经验。但从逻辑的角度来看,你让数据处于不一致的状态,因为你有一半是部分事务。如果这对您来说是可以的,并且如果您可以在启用所有FK约束的情况下这样做,那么就这样吧。再说一次,我的实际经验是,对于我使用过的大型db环境,哪些是有效的,哪些是无效的。我想我们只能同意不同意。@Gik25您可以参考我答案中的链接了解更多信息info@Gik25:min可精确选择任意一行。它不会选择最旧的,因为ROWID不反映任何插入或更新的时间线。