[postgis-users] Query that locks up system memory/disk usage
Kevin Neufeld
kneufeld at refractions.net
Mon Jul 14 17:18:50 PDT 2008
Paul, while "kill -9" will undoubtedly stop the current running query,
it will also crash the entire database cluster since the shared memory
will become corrupt.
I recommend using a "kill -2" instead which is the same thing as issuing
a ctrl^c while in the terminal program. It may take longer since it has
to rollback the transaction, but it will do so gracefully.
-- Kevin
Paul Ramsey wrote:
> Break yourself of the subquery habit:
>
> select a.* from a join b on (st_dwithin(a.the_geom,b.the_geom,50000))
> where b.gid = 10;
>
>
> On your process:
>
> ps ax | grep postgres
>
> Find the process id that is using all the CPU and just kill -9 it. The
> glory of running a proper ACID database like PgSQL is that if you
> don't like what it's doing, you can rip the power cord out of the
> wall, and it'll still start up clean. (Do not try this with MySQL.)
>
> P.
>
> buffer((select b.the_geom
>
>> where gid = 10),50000));
>>
>
> On Mon, Jul 14, 2008 at 4:33 PM, Mike Leahy <mgleahy at alumni.uwaterloo.ca> wrote:
>
>> Hello list,
>>
>> I've run into some situations where running certain queries end up locking
>> up all of my system's ram memory, with constant disk access. I can't cancel
>> the query by hitting ctrl+c in the psql terminal, by restarting the service,
>> or even killing the postmaster. I'm running on a fairly high end system, so
>> it's not an issue with CPU power or available ram. Here's an example of
>> what I did today that caused this:
>>
>> Table A is a table I imported from a tile index shapefile.
>>
>> Table B has several fairly large irregular polygons of different study
>> areas.
>>
>> To get all of the polygons in Table A within a certain distance (50km) of
>> one of the polygons in Table B, without giving it much thought I did the
>> following:
>>
>> select * from a where st_intersects(a.the_geom,buffer((select b.the_geom
>> where gid = 10),50000));
>>
>> I realize how wrong that is, as calculates the buffer for every tile it
>> compares to...I should have done something like:
>>
>> select * from a where st_intersects(a.the_geom,(select b.the_geom where gid
>> = 10)) or st_distance(a.the_geom,(select b.the_geom where gid = 10))<=50000;
>>
>> The problem is...I'm still waiting for the first query to either finish, or
>> cancel, or something. In the meantime, postmaster is still using 99% of my
>> memory, and the disk is still thrashing away (though CPU usage pretty much
>> at 0). What's the best strategy to kill the previous query without having
>> to shut down the entire server?
>>
>> Keep in mind that is just an example of how this can happen for me - I've
>> had it happen in other more complex situations where it was less obvious
>> what I was doing wrong in the logic of the query. I'm just wondering how I
>> can recover from these sorts of mistakes without potentially damaging the
>> database.
>>
>> Regards,
>> Mike
>>
>>
>> _______________________________________________
>> postgis-users mailing list
>> postgis-users at postgis.refractions.net
>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>
>>
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
>
More information about the postgis-users
mailing list