--- postgresql-8.3.7/src/bin/pg_dump/pg_dump.c.orig 2009-03-31 15:47:28.000000000 -0400 +++ postgresql-8.3.7/src/bin/pg_dump/pg_dump.c 2009-04-01 14:07:55.000000000 -0400 @@ -1759,7 +1759,18 @@ /* Cursor to get all BLOB comments */ if (AH->remoteVersion >= 70200) - blobQry = "DECLARE blobcmt CURSOR FOR SELECT loid, obj_description(loid, 'pg_largeobject') FROM (SELECT DISTINCT loid FROM pg_largeobject) ss"; + /* Get comments for BLOBs that have a matching pg_description row. When there are many + * (millions) of BLOBs without comments this avoids fetching and then ignoring them, + * potentionally saving hours of backup time. */ + blobQry = "DECLARE blobcmt CURSOR FOR SELECT loid, obj_description(loid, 'pg_largeobject') FROM (" + "SELECT DISTINCT loid FROM pg_description JOIN pg_largeobject " + "ON (pg_description.objoid = pg_largeobject.loid) " + "WHERE classoid = (" + "SELECT oid FROM pg_class WHERE relname = 'pg_largeobject' AND relnamespace = (" + "SELECT oid FROM pg_namespace WHERE nspname='pg_catalog'" + ")" + ") AND objsubid = 0" + ") ss"; else if (AH->remoteVersion >= 70100) blobQry = "DECLARE blobcmt CURSOR FOR SELECT loid, obj_description(loid) FROM (SELECT DISTINCT loid FROM pg_largeobject) ss"; else