2010-01-07 48 views
0

我有一個類型2數據的數據庫表,我想查找自上次同步後刪除的記錄。它有date_fromdate_to列,原始數據有一個ID列object_iddate_to<>null表示它現在不存在,所以如果沒有其他記錄與object_iddate_to=null相同,則表示它已被刪除。查找從類型2表中刪除的記錄,有效

我相信一個天真的實施將是這樣的:

select * from data_t2 a 
where a.date_to > last_sync_date and a.date_to < current_date() 
and not exists (select * from data_t2 b 
       where b.date_to is null and b.object_id = a.object_id); 

,但顯然,這將是貴得離譜。

有沒有一個明顯更有效的方法,我失蹤了?我懷疑沒有(或者說,我應該假設有相對較少的刪除記錄,並在RDBMS之外進行一些計算),但我想我會問一下以防萬一。

謝謝!

回答

1

在開始調整查詢之前,您確實應該運行EXPLAIN或應用其他一些診斷程序。否則,您將看不到重寫如何更改計劃

您可以使用外部聯接重寫此操作。在例如MySQL的,這將是比子查詢更快:

SELECT * 
FROM  data_t2 a 
LEFT JOIN data_t2 b 
ON  a.object_id = b.object_id 
AND  b.date_to IS NULL 
WHERE  a.date_to > last_sync_date 
AND  a.date_to < current_date()  
AND  b.object_id IS NULL 

如果維度表是真的大,且存在具有DATE_TO作爲第一列的索引,具有DATE_TO IS NULL的行數是整個表的一小部分,這可能會更快:

SELECT * 
FROM  data_t2 a 
LEFT JOIN (
      SELECT object_id 
      FROM data_t2 b 
      WHERE b.date_to IS NULL 
     ) 
ON  a.object_id = b.object_id 
WHERE  a.date_to > last_sync_date 
AND  a.date_to < current_date()  
AND  b.object_id IS NULL 
+0

是的,我知道有可能通過加入變成一個子查詢,我是一個徹頭徹尾的癮君子。這看起來相當簡單。在date_to上添加索引聽起來完全合理,如果它在這裏有幫助。這是一個很好的起點。 – Ken