2009-02-04 43 views
6

我有一個主表A,約900萬行。另一個表B(相同的結構)具有來自表A〜28K行。從表A中刪除B的所有內容的最佳方法是什麼?如何從另一個表中「減去」一張表?

所有列(〜10)的組合都是唯一的。沒有什麼更多的唯一鍵的形式。

回答

6

如果你有足夠的權利,你可以創建一個新表並將其重命名爲A.新表你可以使用下面的腳本:

CREATE TABLE TEMP_A AS 
SELECT * 
FROM A 
MINUS 
SELECT * 
FROM B 

這應該表現不錯。

3
DELETE FROM TableA WHERE ID IN(SELECT ID FROM TableB) 

應該工作。可能需要一段時間。

+1

使用連接刪除可能會更快 – HLGEM 2009-02-04 19:10:42

+1

我的解決方案是開發人員解決方案。不是花哨的DBA解決方案。 :-D但我喜歡學習更多的SQL。 – 2009-02-04 20:18:44

+0

在任何一個表中沒有id列... – Thorsten 2009-02-04 20:59:43

2

的一種方式,只是列出所有列

delete table a 
where exists (select 1 from table b where b.Col1= a.Col1 
AND b.Col2= a.Col2 
AND b.Col3= a.Col3 
AND b.Col4= a.Col4) 
+0

+1表示「單向」,不是針對您的實際代碼... – gbn 2009-02-04 18:26:13

+0

恕我直言,它總是給出它是單向的。任何事情總是有超過17種方式。 – 2009-02-04 18:27:29

0

是否有可以使用的密鑰值(或價值)?

DELETE a 
FROM tableA a 
INNER JOIN tableB b 
on b.id = a.id 
1
Delete t2 
from t1 
inner join t2 
    on t1.col1 = t2.col1 
    and t1.col2 = t2.col2 
    and t1.col3 = t2.col3 
    and t1.col4 = t2.col4 
    and t1.col5 = t2.col5 
    and t1.col6 = t2.col6 
    and t1.col7 = t2.col7 
    and t1.col8 = t2.col8 
    and t1.col9 = t2.col9 
    and t1.col10 = t2.col0 

這很可能是非常慢的,你就必須有當一個表這個尺寸沒有主鍵每一個山坳索引是在環境極不可能的,所以在非高峯期進行。你有什麼擁有一張擁有900萬條記錄且沒有主鍵的表?

1

如果這是你必須定期做的事,首先應該嘗試改進數據庫設計(尋找主鍵,試圖讓「加入」條件儘可能少列儘可能)。

如果這是不可能的,不同的第二種選擇是找出每個列的「選擇性」(即每列有多少「不同」值,「name」會比「address」更具有選擇性國家「而不是」男性/女性「)。 聲明我建議的一般類型會是這樣的:

Delete from tableA 
where exists (select * from tableB 
where tableA.colx1 = tableB.colx1 
and tableA.colx2 = tableB.colx2 
etc. and tableA.colx10 = tableB.colx10). 

的想法是列出列的選擇性秩序,colx1建立索引,colx2等tableB的。表B中確切的列數將是一些試驗&度量的結果。 (抵消了在tableB上建立索引的時間,同時刪除語句的時間得到了改進。)

如果這只是一次性操作,那麼我只需選擇上面列出的一個慢速方法即可。當你回家之前就可以開始發表聲明時,可能不值得花太多的精力去思考這個問題......

相關問題