最大210万行のPostgresテーブルがあります。私はそれについて以下の更新を実行しました:
WITH stops AS (
SELECT id,
rank() OVER (ORDER BY offense_timestamp,
defendant_dl,
offense_street_number,
offense_street_name) AS stop
FROM consistent.master
WHERE citing_jurisdiction=1
)
UPDATE consistent.master
SET arrest_id=stops.stop
FROM stops
WHERE master.id = stops.id;
このクエリの実行には39時間かかりました。私はこれを4(物理)コアi7 Q720ラップトッププロセッサ、大量のRAMで実行していますが、他のほとんどはほとんど実行していません。HDDスペースの制限はありません。テーブルは最近、バキュームされ、分析され、インデックスが再作成されました。
少なくとも最初のWITH
完了後、クエリが実行されている間は常に、CPU使用率は通常低く、HDDは100%使用されていました。HDDが非常に激しく使用されていたため、他のアプリの実行速度は通常よりもかなり遅くなりました。
ラップトップの電源設定は高パフォーマンス(Windows 7 x64)でした。
ここに説明があります:
Update on master (cost=822243.22..1021456.89 rows=2060910 width=312)
CTE stops
-> WindowAgg (cost=529826.95..581349.70 rows=2060910 width=33)
-> Sort (cost=529826.95..534979.23 rows=2060910 width=33)
Sort Key: consistent.master.offense_timestamp, consistent.master.defendant_dl, consistent.master.offense_street_number, consistent.master.offense_street_name
-> Seq Scan on master (cost=0.00..144630.06 rows=2060910 width=33)
Filter: (citing_jurisdiction = 1)
-> Hash Join (cost=240893.51..440107.19 rows=2060910 width=312)
Hash Cond: (stops.id = consistent.master.id)
-> CTE Scan on stops (cost=0.00..41218.20 rows=2060910 width=48)
-> Hash (cost=139413.45..139413.45 rows=2086645 width=268)
-> Seq Scan on master (cost=0.00..139413.45 rows=2086645 width=268)
citing_jurisdiction=1
数万行のみを除外します。そのWHERE
条項があっても、私はまだ200万行以上を操作しています。
ハードドライブは、TrueCrypt 7.1aでドライブ全体が暗号化されています。それは少し物事を遅くしますが、クエリがその多くの時間かかるようにするのに十分ではありません。
WITH
一部のみを実行するために約3分かかります。
arrest_id
フィールドには、外部キーにはインデックスがありませんでした。このテーブルには8つのインデックスと2つの外部キーがあります。クエリの他のすべてのフィールドにはインデックスが付けられます。
arrest_id
フィールドは除いては制約がありませんでしたNOT NULL
。
テーブルには合計32列があります。
arrest_id
型は、文字型Variable(20)です。私rank()
は数値を生成することを認識していますが、このフィールドに非数値データを使用する他の行があるため、文字を変化させる(20)citing_jurisdiction<>1
を使用する必要があります。
のarrest_id
すべての行のフィールドは空白でしたciting_jurisdiction=1
。
これは個人用のハイエンド(1年前)のラップトップです。私は唯一のユーザーです。他のクエリまたは操作は実行されていません。ロックはありそうもない。
このテーブルまたはデータベースのどこにもトリガーはありません。
このデータベースに対する他の操作に時間がかかることはありません。適切なインデックスを使用すると、SELECT
クエリは通常非常に高速です。
Seq Scan
は少し怖いです