2010-08-17 75 views
0

條件我想執行一個SQL查詢在邏輯上等同於以下內容:有效途徑凡在SQL語句

DELETE FROM pond_pairs 
WHERE 
    ((pond1 = 12) AND (pond2 = 233)) OR 
    ((pond1 = 12) AND (pond2 = 234)) OR 
    ((pond1 = 12) AND (pond2 = 8)) OR 
    ((pond1 = 13) AND (pond2 = 6547)) OR 
    ((pond1 = 13879) AND (pond2 = 6)) 

我將有幾十萬pond1 - pond2對。我有(pond1, pond2)的索引。

我有限的知識SQL想出了幾種方法:

  1. 運行整個查詢的是。
  2. 批量查詢成更小的查詢與nWHERE條件
  3. 保存pond1 - pond2對到一個新表,並做一個子查詢WHERE子句中識別
  4. 轉換標識要刪除的行蟒蛇邏輯進入存儲過程。請注意,我不熟悉編程的存儲過程,因此這可能會涉及到一個陡峭的學習曲線。

我使用Postgres的,如果這是相關的。

回答

1

對於大量的pond1-pond2對在一個DELETE中被刪除,我會創建臨時表並加入到這張表中。

-- Create the temp table: 
CREATE TEMP TABLE foo AS SELECT * FROM (VALUES(1,2), (1,3)) AS sub (pond1, pond2); 

-- Delete 
DELETE FROM bar 
USING 
    foo -- the joined table 
WHERE 
    bar.pond1= foo.pond1 
AND 
    bar.pond2 = foo.pond2; 
+0

雖然(除非對已經存在於數據庫中),但使用對填充TEMP TABLE與原始DELETE問題是等效的問題。 – Thilo 2010-08-17 06:10:19

+1

不,您可以使用COPY填充臨時表。這比其他選項更快地將數據存入臨時表。我只是舉了一個非常簡單的例子,但這個想法是一樣的。 – 2010-08-17 06:15:48

+0

您能否演示如何使用COPY填充臨時表? – Thilo 2010-08-17 06:37:45

1

我會做3.(與JOIN,而不是子查詢),測量DELETE查詢的時間(不創建表和插入)。這是很好的起點,因爲加入是非常普遍和優化過程中,所以這將是很難被擊敗的那個時候。然後,您可以將該時間與您當前的方法進行比較。你

也可以嘗試以下方法:以同樣的方式

  1. 排序對作爲索引。
  2. 從您的描述中刪除使用方法2.(可能在單個事務中)。

刪除前的排序會提高索引讀取性能,因爲硬盤緩存工作的可能性更大。

+0

DELETE作品對連接的表? – Thilo 2010-08-17 06:03:21

+0

是的,你有例子在弗蘭克Heikens答案。 – 2010-08-17 06:12:46

+0

,使用條款整潔。但他仍然需要將這些對發送到數據庫中e(除非他們已經在某處)。 – Thilo 2010-08-17 06:44:29

0

由於SQL語句太長,因此有成千上萬對,因此您無法執行1(按原樣運行查詢)。

3如果您已經在表格中配對了,那麼這很好。如果不是,您需要先插入它們。如果您以後不需要它們,那麼您可以運行相同數量的DELETE語句而不是INSERT語句。

如何在循環一份聲明,也許分批(如果Python的支持)

  1. 開始交易
  2. 準備語句「DELETE FROM pond_pairs WHERE((pond1 =?)AND(pond2 =?))」
  3. 環比數據(在Python),並運行一個對的語句(或添加到批)
  4. 提交

哪裏都是對來自哪裏?如果你能寫一個SELECT語句來識別它們,你可以移動這個條件進入你刪除的WHERE子句。

DELETE FROM pond_pairs WHERE (pond1, ponds) in (SELECT pond1, pond2 FROM ...... )