Эффективно находить удаленные записи из таблицы типа 2 - PullRequest
0 голосов
/ 08 января 2010

У меня есть таблица базы данных типа 2, и я хочу найти записи, которые были удалены с момента последней синхронизации с ней. Он имеет столбцы date_from и date_to, а необработанные данные имеют столбец идентификатора 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);

но, очевидно, это будет смехотворно дорого.

Есть ли очевидный, более эффективный способ, который я пропускаю? Я подозреваю, что нет (или, скорее, я должен предположить, что удаленных записей относительно немного, и выполнить некоторые вычисления вне СУБД), но я решил, что на всякий случай задам вопрос.

Спасибо!

1 Ответ

1 голос
/ 08 января 2010

Перед тем, как приступить к настройке запроса, вам действительно нужно запустить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...