[Spacewalk-list] Run away DELETE query eating my disk space
Chris
dmagick at gmail.com
Wed Apr 30 23:21:43 UTC 2014
On 30/04/14 14:05, Jon Miller wrote:
> Before asking for more disk space, I scheduled some down time to perform a
> "VACUUM FULL VERBOSE ANALYZE" on my PostgreSQL database today along with
> rebuilding all of my indexes in the DB. After bringing Spacewalk back up
> again, the DELETE query commenced again and is right back in the same cycle
> again. I was hoping that a full maintenance cycle would magically fix things
> for me.
>
> So more detail on my situation. Here is the EXPLAIN plan which also gives you
> insight into our DB size with the row counts:
>
> EXPLAIN DELETE FROM rhnPackageChangeLogData WHERE id NOT IN ( SELECT DISTINCT changelog_data_id FROM rhnPackageChangeLogRec );
> QUERY PLAN
> ------------------------------------------------------------------------------------------------------
> Seq Scan on rhnpackagechangelogdata (cost=318312.96..134742963.76 rows=192456 width=6)
> Filter: (NOT (SubPlan 1))
> SubPlan 1
> -> Materialize (cost=318312.96..318905.08 rows=42512 width=8)
> -> HashAggregate (cost=317678.33..318103.45 rows=42512 width=8)
> -> Seq Scan on rhnpackagechangelogrec (cost=0.00..281315.66 rows=14545066 width=8)
>
> Beyond just raw row counts, the size of each table are
> rhnPackageChangeLogData = 110 MB and rhnPackageChangeLogRec = 2469 MB. Trying
> my best to impersonate a DBA here. A couple things I'm contemplating now:
>
> 1. Try increasing the working memory parameter.
> I'm thinking this due to the fact that it looks like it wants to load a
> ~2.5G hash in memory for that subquery. Within my postgresql.conf file,
> the "work_mem" is not explicitly set and I'm still trying to figure out
> how to query the current size.
>
> 2. Drop the DISTINCT clause from the subquery.
> I'm thinking this because the EXPLAIN without the 'DISTINCT' clause makes
> it drop the HashAggregate step:
> EXPLAIN DELETE FROM rhnPackageChangeLogData WHERE id NOT IN ( SELECT changelog_data_id FROM rhnPackageChangeLogRec );
> QUERY PLAN
> ------------------------------------------------------------------------------------------------
> Seq Scan on rhnpackagechangelogdata (cost=352677.73..45926203886.33 rows=192456 width=6)
> Filter: (NOT (SubPlan 1))
> SubPlan 1
> -> Materialize (cost=352677.73..554945.39 rows=14545066 width=8)
> -> Seq Scan on rhnpackagechangelogrec (cost=0.00..281315.66 rows=14545066 width=8)
>
> I actually see the following comment within the Task_queries.xml file:
> "DISTINCT makes the DELETE faster for postgresql" but as I'm thinking "less
> memory and able to complete" might be preferable than potential speed.
>
> 3. Others? Perhaps there an alternate SQL approach that can be taken? Or would you
> suspect something else is terrible wrong here?
Reverse the logic so you find the id's to explicitly delete:
delete from rhnPackageChangeLogData where id in (SELECT d.id from
rhnPackageChangeLogData d left join rhnPackageChangeLogRec l on
(d.id=l.changelog_data_id) where l.changelog_data_id is null);
I don't think I have the same amount of data as you, but here are some
quick stats:
spacewalk=# SELECT count(*) from rhnPackageChangeLogData;
count
--------
176325
(1 row)
Time: 20.140 ms
spacewalk=#
spacewalk=# select count(*) from rhnPackageChangeLogRec;
count
---------
5121684
(1 row)
Time: 421.497 ms
spacewalk=# begin;
BEGIN
spacewalk=# delete from rhnPackageChangeLogData where id in (SELECT d.id
from rhnPackageChangeLogData d left join rhnPackageChangeLogRec l on
(d.id=l.changelog_data_id) where l.changelog_data_id is null);
DELETE 0
Time: 2646.490 ms
spacewalk=# rollback;
ROLLBACK
Time: 0.155 ms
--
Postgresql & php tutorials
http://www.designmagick.com/
More information about the Spacewalk-list
mailing list