2012-02-15 13 views
1

テーブルが巨大です。アプリケーションをテストするために、テーブルから1000のレコードを除くすべてを削除したいと思います。 1000の幸運なレコードは、次のように指定できる識別子を持っていません:削除11gから1000レコードが残っていますか?

DELETE FROM HUGE_TABLE t WHERE t.IDENTIFIER!='LUCKY' 

1つのSQL文にはどのような方法がありますか?

答えて

0

numberOfRecordsOnYourDBカウントはるかに高速であることを行っていることを他の回答に同意:

+1

を行うには、新しい接続をオープンすることを忘れないでください...? –

+2

オラクルの質問ではありませんでしたか? –

3

一時テーブルを作成します。

CREATE TABLE HUGE_TEST AS 
    SELECT * FROM HUGE_TABLE WHERE ROWNUM <= 1000; 

今、あなたがテストのためにこれを使用するか、またはあなたの元のテーブルを削除し、実際のテーブル名に、このテーブルの名前を変更することができます。

2
  • TempHugeTableに
  • TempHugeTable
  • 挿入幸運レコードを新しい一時テーブルを作成します(または、HugeTableにTempHugeTableの名前を変更しますが、インデックスとそのような他のものの世話をする)
  • 切り捨てHugeTable(または削除)

これは、膨大な量のデータを処理する最速の方法です。巨大なテーブルで少量のデータを更新する必要がある場合にも機能します。

DELETE FROM huge_table 
WHERE id NOT IN (
    SELECT id FROM (
    SELECT id FROM huge_table 
    ORDER BY dbms_random.value 
) WHERE rownum <= 1000 
) 

しかし、私は切り捨てと順序を回避することが

1

はあなたの真の乱数の別のオプションを与えるために、あなたはこれを試みることができます次のようにします。

set ROWCOUNT (numberOfRecordsOnYourDB - 1000) 
delete from hugetable 
Go 

これは、テーブルからレコードを削除しますが、指定した行数の後で処理を停止します。

ああ、大きな値に戻しROWCOUNTを設定する、または単にSQL Serverの構文のように見える他のタスク

関連する問題