Postgresql
只需刪除 PostgreSQL 表上的 50.000.000 行,數據庫仍然很慢
對不起我糟糕的英語。
我有一個在亞馬遜 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;