0

タイプ2データのデータベーステーブルがあり、最後に同期してから削除されたレコードを検索したいと思います。と列がdate_fromありdate_to、生データにはID列がありますobject_iddate_to<>nullこれは、現在存在しないことを意味します。したがって、同じobject_idandを持つレコードが他にない場合は、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 に答える