--- 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 10:25:39.000000000 -0400 @@ -1759,7 +1759,13 @@ /* 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. + * Note that it may still select BLOBs that have no comment if a pg_description row's objoid + * matches a BLOB's loid, but references an object contained in a different system catalog, + * thus the PQgetisnull() check below is still needed to ignore them. */ + 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)) 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