0

我有一个类型 2 数据的数据库表,我想查找自上次与它同步以来已删除的记录。它有date_fromdate_to列,原始数据有一个 ID 列object_iddate_to<>null表示它现在不存在,所以如果没有其他具有相同object_id和的记录date_to=null,则它已被删除。

我相信一个天真的实现会是这样的:

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 之外进行一些计算),但我想我会问以防万一。

谢谢!

4

1 回答 1

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
于 2010-01-07T23:55:54.363 回答