我有一个2型数据的数据库表,我想查找自上次与之同步后删除的记录。它有date_from
和date_to
列,原始数据有ID列object_id
。 date_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之外进行一些计算),但我想我会问以防万一。
谢谢!
答案 0 :(得分: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