5

行 ID を使用して削除する重大な禁忌はありますか?

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);
4

2 に答える 2

9

min(rowid)それが「最も早い」行を返すと仮定すると、はい、問題があります(そうではないため)

重複の 1 つを取得するためだけに使用する場合min(rowid)(どちらを気にしない場合)、いいえ、そのステートメントに問題はありません。

于 2012-07-19T16:53:28.170 に答える
2

注意すべき点がいくつかあります。特定のグループ化の最も早い行を提供するために行 ID に依存しているようです (選択 min(rowid) ...)。これは常に真実であるとは限りません。最も古いレコードを削除していることを保証する唯一の方法は、順序付けできる列 (タイムスタンプなど) を使用することです。 トム・カイトがこれを私よりもうまく説明しています。

行 ID は、行の物理的な位置以外には何も意味しません。年齢、挿入の順序、またはそのようなものを意味するものではありません。

また、テーブルのサイズによっては、多くの REDO/UNDO が生成されます。大きなテーブルでは、pl/sql を使用してチャンクで削除し、x 行ごとにコミットすることが有益な場合があります。

ちょうど私の考え

于 2012-07-19T16:48:53.050 に答える