首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效地从type-2表中查找已删除的记录

高效地从type-2表中查找已删除的记录
EN

Stack Overflow用户
提问于 2010-01-08 07:33:08
回答 1查看 318关注 0票数 0

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

我认为一个天真的实现应该是这样的:

代码语言:javascript
复制
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之外进行一些计算),但我认为我应该问一下,以防万一。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2010-01-08 07:55:54

在开始调优查询之前,确实应该运行EXPLAIN或应用一些其他诊断。否则,您将无法看到重写如何更改计划

你可以用一个外部连接重写它。例如,在MySQL中,这将比子查询快得多:

代码语言:javascript
复制
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为NULL的行数只占整个表的一小部分,那么这样做可能会更快:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2024500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档