2012-02-15 108 views
1

表是巨大的。對於測試應用程序,我想刪除表中除1000條記錄以外的所有內容。 1000個幸運記錄沒有可以給出的標識符:從刪除11g剩下1000條記錄?

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

什麼是一個sql語句中的最佳方式?

回答

0

算numberOfRecordsOnYourDB並且這樣做:

set ROWCOUNT (numberOfRecordsOnYourDB - 1000) 
delete from hugetable 
Go 

這將刪除表中的記錄,但在指定的行數後停止處理。

哦,不要忘記設置ROWCOUNT回到大值,或者只是打開一個新的連接做其他任務

+1

這看起來像SQL Server語法......? – 2012-02-15 12:26:30

+2

對Oracle來說不是問題嗎? – 2012-02-15 17:19:35

3

創建一個臨時表:

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

現在你可以使用這個測試,或刪除原始表,此表重命名爲實際的表名。

2
  • 創建一個新的臨時表TempHugeTable
  • 插入幸運記錄到TempHugeTable(或重命名TempHugeTable到HugeTable,但照顧索引和其他東西一樣的)
  • 截斷HugeTable(或刪除)

這是處理海量數據的最快方式,作品也當你有一個巨大的表格只更新量小。

1

給你真正的隨機性的另一種選擇,你可以試試這個:

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

但我與其他答案同意,截斷和避免排序將是快了很多