次の構造(簡略化)のファイルとディレクトリの階層を表すデータベーステーブルがあります。
アイテム ID int パス テキスト タイプ int (ファイルの場合は 0、ディレクトリの場合は 1) 親 ID int BackupTime 日時
現在、このBackupTime
列はファイルにのみ使用され、ディレクトリの場合は null に設定されています。
ここで、ディレクトリについてもこの列に入力する必要があります。これはBackupTime
、すべての子孫 (ファイルとディレクトリ) の最小値でなければなりません。
この (素朴で非効率的な) クエリは、私がやりたいことを示しています。
update Items i
set BackupTime = (select min(BackupTime)
from Items d
where d.Path like i.Path || '%'
and d.Type = 0)
where i.Type = 1
私の問題は、効率的なアプローチが見つからないように見えることです。上記のクエリは、大量のデータに対して非常に時間がかかります (このテーブルには、多くの場合、10 万行を超える行が含まれます)。
min(BackupTime)
直接の子のみを検索する方がおそらく高速です。
update Items i
set BackupTime = (select min(BackupTime)
from Items d
where d.ParentId = i.ItemId)
where i.Type = 1
しかし、これが機能するためには、先祖よりも先に子孫が更新されるようにする必要があるため、階層をボトムアップで再帰的にたどる必要があります。問題は、どの項目が階層の中で最も深いかを簡単に知る方法がないことです。SQLite を使用しているため、階層クエリを使用できません。
これを効率的に行う方法について何か考えはありますか?
理想的には、単一の UPDATE クエリで実行できるようにしたいのですが、それが不可能な場合は、効率的である限り、他のオプションを受け入れることができます。