Postgresql

只需刪除 PostgreSQL 表上的 50.000.000 行,數據庫仍然很慢

  • July 22, 2021

對不起我糟糕的英語。

我有一個在亞馬遜 RDS (db.t3.small) 上執行的 postgres 數據庫,以 django 作為後端。我犯了一個錯誤並創建了 50.000.000 行。當我弄清楚(因為該表上的查詢超慢)時,我將其全部刪除。但是我對該表進行的查詢仍然非常慢。它現在只有 300 行。

我必須清理一些記憶體?我要等什麼?在 aws 中 RDS 的配置是預設的。

postgres 的引擎版本是 12.5,還安裝了 postgis。

我檢查真空問題並執行以下命令:

SELECT relname AS TableName,n_live_tup AS LiveTuples,n_dead_tup AS DeadTuples,last_autovacuum AS Autovacuum,last_autoanalyze AS Autoanalyze FROM pg_stat_user_tables;

有問題的表格說:

'appointment_timeslot', 1417, 0, datetime.datetime(2021, 7, 21, 18, 13, 8, 193967, tzinfo=<UTC>), datetime.datetime(2021, 7, 21, 18, 13, 30, 551750, tzinfo=<UTC>)

檢查 Django 在該表上自動創建的索引,我發現 4

[
('appointment_timeslot_pkey', 'CREATE UNIQUE INDEX appointment_timeslot_pkey ON public.appointment_timeslot USING btree (id)')
'appointment_timeslot_home_visit_id_62df4faf', 'CREATE INDEX appointment_timeslot_home_visit_id_62df4faf ON public.appointment_timeslot USING btree (home_visit_id)')
('appointment_timeslot_office_id_6871b47b', 'CREATE INDEX appointment_timeslot_office_id_6871b47b ON public.appointment_timeslot USING btree (office_id)')
('appointment_timeslot_time_range_id_715578fa', 'CREATE INDEX appointment_timeslot_time_range_id_715578fa ON public.appointment_timeslot USING btree (time_range_id)')
]

刪除行不會縮小表,因此順序掃描幾乎和以前一樣長。

重寫和收縮表

VACUUM (FULL) appointment_timeslot;

引用自:https://dba.stackexchange.com/questions/295980