Hi, Sorry for not giving enough information.. I didn't want to pollute you with too much detail... So, the version of postgres I use is : samokk@samlaptop:~/Desktop $ dpkg -l | grep postgres ii postgresql-8.2 8.2.5-1.1 object-relational SQL database, version 8.2 ii postgresql-8.2-postgis 1.2.1-2 geographic objects support for PostgreSQL 8. ii postgresql-client-8.2 8.2.5-1.1 front-end programs for PostgreSQL 8.2 ii postgresql-client-common 78 manager for multiple PostgreSQL client versi ii postgresql-common 78 manager for PostgreSQL database clusters ii postgresql-contrib-8.2 8.2.5-1.1 additional facilities for PostgreSQL samokk@samlaptop:~/Desktop $ uname -a Linux samlaptop 2.6.22-14-generic #1 SMP Sun Oct 14 23:05:12 GMT 2007 i686 GNU/Linux The exact query that is run is : select * from RoommateResidenceOffer this_ inner join AdCreatedEvent ace3_ on this_.adCreatedEvent_id=ace3_.id left outer join FunalaEvent ace3_1_ on ace3_.id=ace3_1_.id left outer join Account account6_ on ace3_.eventInitiator_id=account6_.id left outer join ContactInformation contactinf7_ on account6_.contactInformation_id=contactinf7_.id left outer join City city8_ on contactinf7_.city_id=city8_.id inner join ResidenceDescription residenced19_ on this_.residenceDescription_id=residenced19_.id inner join City city1_ on residenced19_.city_id=city1_.id inner join GisFeature gf2_ on city1_.associatedGisFeature_id=gf2_.id left outer join ResidenceType residencet22_ on residenced19_.residenceType_id=residencet22_.id where gf2_.location && setSRID(cast ('BOX3D(1.5450494105576016 48.73176862850233,3.1216171894423983 49.00156477149768)'as box3d), 4326) AND distance_sphere(gf2_.location, GeomFromText('POINT(2.3333333 48.8666667)',4326)) <= 15000 limit 10 offset 10 The full Explain Analyze for this query is attached in "exp1.txt". ---- The slightly modified version of the query above, using inner join instead of outer join for outer join City city8_ on contactinf7_.city_id=city8_.id select * from RoommateResidenceOffer this_ inner join AdCreatedEvent ace3_ on this_.adCreatedEvent_id=ace3_.id left outer join FunalaEvent ace3_1_ on ace3_.id=ace3_1_.id left outer join Account account6_ on ace3_.eventInitiator_id=account6_.id left outer join ContactInformation contactinf7_ on account6_.contactInformation_id=contactinf7_.id inner join City city8_ on contactinf7_.city_id=city8_.id inner join ResidenceDescription residenced19_ on this_.residenceDescription_id=residenced19_.id inner join City city1_ on residenced19_.city_id=city1_.id inner join GisFeature gf2_ on city1_.associatedGisFeature_id=gf2_.id left outer join ResidenceType residencet22_ on residenced19_.residenceType_id=residencet22_.id where gf2_.location && setSRID(cast ('BOX3D(1.5450494105576016 48.73176862850233,3.1216171894423983 49.00156477149768)'as box3d), 4326) AND distance_sphere(gf2_.location, GeomFromText('POINT(2.3333333 48.8666667)',4326)) <= 15000 limit 10 offset 10 The full explain analyze is included in exp2.txt. So, now the part of the schema that is relevant : Table « public.roommateresidenceoffer » Colonne | Type | Modificateurs ---------------------------------------+------------------------+--------------- id | bigint | not null endofavailabilitydate | date | minimumleasedurationinmonths | integer | not null brokerfees | numeric(19,2) | not null currencycode | character varying(255) | not null monthlyadditionalchargesapproximation | numeric(19,2) | not null monthlybaseprice | numeric(19,2) | not null pricingperiod | character varying(255) | not null securitydeposit | numeric(19,2) | not null startofavailabilitydate | date | not null sublease | boolean | not null cabletv | boolean | not null electricity | boolean | not null heat | boolean | not null highspeedinternetaccess | boolean | not null phoneline | boolean | not null satellitetv | boolean | not null securitysystem | boolean | not null trashpickup | boolean | not null unlimitedphoneplan | boolean | not null water | boolean | not null offerdescriptiontext | text | totalnumberofroommates | integer | not null willhaveseparateroom | boolean | not null adcreatedevent_id | bigint | residencedescription_id | bigint | Index : « roommateresidenceoffer_pkey » PRIMARY KEY, btree (id) « roommateresidenceofferadcreatedevent » btree (adcreatedevent_id) Contraintes de clés étrangères : « fk27b7359611df9610 » FOREIGN KEY (adcreatedevent_id) REFERENCES adcreatedevent(id) « fk27b73596364f1d0 » FOREIGN KEY (residencedescription_id) REFERENCES residencedescription(id) sirika_development=# \d adcreatedevent Table « public.adcreatedevent » Colonne | Type | Modificateurs -------------------+--------+--------------- id | bigint | not null eventinitiator_id | bigint | Index : « adcreatedevent_pkey » PRIMARY KEY, btree (id) Contraintes de clés étrangères : « fk4422475278f7361 » FOREIGN KEY (id) REFERENCES funalaevent(id) « fk4422475e7e1a3f5 » FOREIGN KEY (eventinitiator_id) REFERENCES account(id) sirika_development=# \d funalaevent Table « public.funalaevent » Colonne | Type | Modificateurs --------------+-----------------------------+--------------- id | bigint | not null utceventdate | timestamp without time zone | not null Index : « funalaevent_pkey » PRIMARY KEY, btree (id) « funalaeventdate » btree (utceventdate) \d Account; Table « public.account » Colonne | Type | Modificateurs -------------------------+------------------------+--------------- id | bigint | not null login | character varying(255) | not null password | character varying(255) | not null settings_id | bigint | profile_id | bigint | declaredasadultevent_id | bigint | contactinformation_id | bigint | Index : « account_pkey » PRIMARY KEY, btree (id) « account_login_key » UNIQUE, btree ("login") Contraintes de clés étrangères : « fk1d0c220d3f80c97 » FOREIGN KEY (declaredasadultevent_id) REFERENCES declaredasadultevent(id) « fk1d0c220d7c918a2a » FOREIGN KEY (settings_id) REFERENCES accountsettings(id) « fk1d0c220d95133e52 » FOREIGN KEY (profile_id) REFERENCES userprofile(id) « fk1d0c220ddfd5cd37 » FOREIGN KEY (contactinformation_id) REFERENCES contactinformation(id) \d ContactInformation Table « public.contactinformation » Colonne | Type | Modificateurs -----------------------------+------------------------+--------------- id | bigint | not null street | text | zipcode | text | name | character varying(255) | currentemailchangedevent_id | bigint | city_id | bigint | Index : « contactinformation_pkey » PRIMARY KEY, btree (id) « contactinformationcity » btree (city_id) « contactinformationcurrentemailchangedevent » btree (currentemailchangedevent_id) Contraintes de clés étrangères : « fk36e2e10c6412f2ff » FOREIGN KEY (city_id) REFERENCES city(id) « fk36e2e10cb79b5056 » FOREIGN KEY (currentemailchangedevent_id) REFERENCES emailchangedevent(id) \d City Table « public.city » Colonne | Type | Modificateurs -------------------------+--------+--------------- id | bigint | not null associatedgisfeature_id | bigint | Index : « city_pkey » PRIMARY KEY, btree (id) « cityassociatedgisfeatureid » btree (associatedgisfeature_id) « cityid » btree (id) Contraintes de clés étrangères : « fk200d8b1020e199 » FOREIGN KEY (associatedgisfeature_id) REFERENCES gisfeature(id) Table « public.residencedescription » Colonne | Type | Modificateurs -------------------------------+------------------+--------------- id | bigint | not null street | text | zipcode | text | barbecueandpicnicarea | boolean | not null basketballcourt | boolean | not null bikeshelter | boolean | not null billiards | boolean | not null clubhouse | boolean | not null conferenceroom | boolean | not null doorman | boolean | not null drycleaner | boolean | not null fitnesscenter | boolean | not null gatedentrance | boolean | not null laundryfacility | boolean | not null onsitemanagement | boolean | not null pool | boolean | not null sauna | boolean | not null spa | boolean | not null tenniscourt | boolean | not null residencedescriptiontext | text | extrastorage | boolean | not null privatepool | boolean | not null privatesauna | boolean | not null privatespa | boolean | not null airconditioning | boolean | not null areainsquaremeters | double precision | balcony | boolean | not null basefloornumber | integer | buzzer | boolean | not null ceilingfan | boolean | not null dishwasher | boolean | not null disposal | boolean | not null dryer | boolean | not null dvd | boolean | not null elevator | boolean | not null firedetector | boolean | not null fireplace | boolean | not null fullkitchen | boolean | not null furnished | boolean | not null hifi | boolean | not null housewaresinkitchen | boolean | not null microwave | boolean | not null numberofbathrooms | integer | numberofbedrooms | integer | numberoflivingrooms | integer | numberofseparatedtoilets | integer | oven | boolean | not null patio | boolean | not null refrigerator | boolean | not null stove | boolean | not null totalnumberoffloorsinbuilding | integer | tv | boolean | not null vcr | boolean | not null washer | boolean | not null wheelchairaccess | boolean | not null yard | boolean | not null coveredparkingspaces | integer | not null garage | boolean | not null streetparkingavailability | bigint | uncoveredparkingspaces | integer | not null petsallowed | boolean | not null smokingallowed | boolean | not null city_id | bigint | residencetype_id | bigint | Index : « residencedescription_pkey » PRIMARY KEY, btree (id) « residencedescriptioncity » btree (city_id) Contraintes de clés étrangères : « fk997d05366412f2ff » FOREIGN KEY (city_id) REFERENCES city(id) « fk997d0536a3749aa4 » FOREIGN KEY (residencetype_id) REFERENCES residencetype(id) \d gisfeature Table « public.gisfeature » Colonne | Type | Modificateurs -------------------------+-----------------------------+--------------- id | bigint | not null asciiname | character varying(255) | elevation | bigint | featureclass | character varying(255) | featurecode | character varying(255) | featureid | bigint | not null featuresource | character varying(255) | not null gtopo30averageelevation | bigint | location | geometry | modificationdate | timestamp without time zone | name | character varying(255) | population | bigint | timezone | character varying(255) | parententity_id | bigint | Index : « gisfeature_pkey » PRIMARY KEY, btree (id) « gisfeatureasciiname » btree (asciiname) « gisfeaturefeatureid » btree (featureid) « gisfeaturefeaturesource » btree (featuresource) « gisfeatureid » btree (id) « gisfeaturelocation » gist ("location") « gisfeaturenamestartswith » btree (lower(name::text) varchar_pattern_ops) « gisfeatureparententityid » btree (parententity_id) « gisfeaturepopulation » btree (population) Contraintes de clés étrangères : « fk6372220511a389a5 » FOREIGN KEY (parententity_id) REFERENCES abstractadministrativeentity(id) \d residencetype Table « public.residencetype » Colonne | Type | Modificateurs ---------------------+------------------------+--------------- id | bigint | not null code | character varying(255) | not null residenceattachment | integer | Index : « residencetype_pkey » PRIMARY KEY, btree (id) « residencetype_code_key » UNIQUE, btree (code) If you need more information for your diagnostic, do not hesitate to request ;-) Thanks a lot for your help, Sami Dalouche Le dimanche 28 octobre 2007 à 18:08 -0400, Tom Lane a écrit : > Sami Dalouche <skoobi@xxxxxxx> writes: > > So, what could prevent postgrs from using the index ? > > You've carefully withheld all the details that might let us guess. > If I had to guess anyway, I'd guess this is a pre-8.2 PG release > that doesn't know how to rearrange outer joins, but there are any > number of other possibilities. > > If you want useful help on a query planning issue, you generally need > to provide > - the exact Postgres version > - full schema declaration of the relevant tables > - exact queries tested > - full EXPLAIN ANALYZE output > With less info than that, people are just shooting in the dark. > > regards, tom lane > > ---------------------------(end of broadcast)--------------------------- > TIP 9: In versions below 8.0, the planner will ignore your desire to > choose an index scan if your joining column's datatypes do not > match
QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=231579.22..231579.22 rows=1 width=728) (actual time=31694.695..31694.881 rows=10 loops=1) -> Hash Left Join (cost=175223.17..231579.22 rows=2 width=728) (actual time=31694.513..31694.847 rows=20 loops=1) Hash Cond: (residenced19_.residencetype_id = residencet22_.id) -> Hash Join (cost=175221.97..231577.99 rows=2 width=703) (actual time=31673.089..31673.327 rows=20 loops=1) Hash Cond: (city1_.associatedgisfeature_id = gf2_.id) -> Hash Join (cost=172805.64..228974.15 rows=50000 width=546) (actual time=31580.727..31580.879 rows=20 loops=1) Hash Cond: (residenced19_.city_id = city1_.id) -> Hash Join (cost=94091.95..130023.46 rows=50000 width=530) (actual time=19588.949..22856.266 rows=50000 loops=1) Hash Cond: (this_.residencedescription_id = residenced19_.id) -> Hash Left Join (cost=87371.30..116064.81 rows=50000 width=308) (actual time=17404.025..17644.729 rows=50000 loops=1) Hash Cond: (contactinf7_.city_id = city8_.id) -> Hash Left Join (cost=8657.62..20542.12 rows=50000 width=292) (actual time=3894.656..7765.298 rows=50000 loops=1) Hash Cond: (account6_.contactinformation_id = contactinf7_.id) -> Hash Left Join (cost=8656.51..19853.50 rows=50000 width=253) (actual time=3894.587..7565.762 rows=50000 loops=1) Hash Cond: (ace3_.eventinitiator_id = account6_.id) -> Hash Left Join (cost=8655.40..19403.56 rows=50000 width=192) (actual time=3894.468..7379.405 rows=50000 loops=1) Hash Cond: (ace3_.id = ace3_1_.id) -> Hash Join (cost=3591.00..10105.67 rows=50000 width=176) (actual time=3058.596..5371.813 rows=50000 loops=1) Hash Cond: (ace3_.id = this_.adcreatedevent_id) -> Seq Scan on adcreatedevent ace3_ (cost=0.00..2323.41 rows=149641 width=16) (actual time=0.038..1452.758 rows=149641 loops=1) -> Hash (cost=1818.00..1818.00 rows=50000 width=160) (actual time=1793.711..1793.711 rows=50000 loops=1) -> Seq Scan on roommateresidenceoffer this_ (cost=0.00..1818.00 rows=50000 width=160) (actual time=17.340..1584.689 rows=50000 loops=1) -> Hash (cost=2389.62..2389.62 rows=149662 width=16) (actual time=835.791..835.791 rows=149662 loops=1) -> Seq Scan on funalaevent ace3_1_ (cost=0.00..2389.62 rows=149662 width=16) (actual time=103.232..555.443 rows=149662 loops=1) -> Hash (cost=1.05..1.05 rows=5 width=61) (actual time=0.071..0.071 rows=5 loops=1) -> Seq Scan on account account6_ (cost=0.00..1.05 rows=5 width=61) (actual time=0.050..0.056 rows=5 loops=1) -> Hash (cost=1.05..1.05 rows=5 width=39) (actual time=0.046..0.046 rows=5 loops=1) -> Seq Scan on contactinformation contactinf7_ (cost=0.00..1.05 rows=5 width=39) (actual time=0.025..0.030 rows=5 loops=1) -> Hash (cost=37037.86..37037.86 rows=2331986 width=16) (actual time=9232.251..9232.251 rows=2331986 loops=1) -> Seq Scan on city city8_ (cost=0.00..37037.86 rows=2331986 width=16) (actual time=0.043..4694.169 rows=2331986 loops=1) -> Hash (cost=3365.40..3365.40 rows=77540 width=222) (actual time=2183.568..2183.568 rows=77540 loops=1) -> Seq Scan on residencedescription residenced19_ (cost=0.00..3365.40 rows=77540 width=222) (actual time=0.033..1875.987 rows=77540 loops=1) -> Hash (cost=37037.86..37037.86 rows=2331986 width=16) (actual time=8024.211..8024.211 rows=2331986 loops=1) -> Seq Scan on city city1_ (cost=0.00..37037.86 rows=2331986 width=16) (actual time=0.075..3488.792 rows=2331986 loops=1) -> Hash (cost=2413.73..2413.73 rows=208 width=157) (actual time=92.330..92.330 rows=1697 loops=1) -> Bitmap Heap Scan on gisfeature gf2_ (cost=22.54..2413.73 rows=208 width=157) (actual time=58.968..89.167 rows=1697 loops=1) Filter: (("location" && '0103000020E610000001000000050000009BC810BB85B8F83F01D42B98AA5D48409BC810BB85B8F83F4134414633804840D44ADA6E12F908404134414633804840D44ADA6E12F9084001D42B98AA5D48409BC810BB85B8F83F01D42B98AA5D4840'::geometry) AND (distance_sphere("location", '0101000020E6100000915731A6AAAA0240218436EFEE6E4840'::geometry) <= 15000::double precision)) -> Bitmap Index Scan on gisfeaturelocation (cost=0.00..22.49 rows=625 width=0) (actual time=58.505..58.505 rows=2761 loops=1) Index Cond: ("location" && '0103000020E610000001000000050000009BC810BB85B8F83F01D42B98AA5D48409BC810BB85B8F83F4134414633804840D44ADA6E12F908404134414633804840D44ADA6E12F9084001D42B98AA5D48409BC810BB85B8F83F01D42B98AA5D4840'::geometry) -> Hash (cost=1.09..1.09 rows=9 width=25) (actual time=21.261..21.261 rows=9 loops=1) -> Seq Scan on residencetype residencet22_ (cost=0.00..1.09 rows=9 width=25) (actual time=21.215..21.230 rows=9 loops=1) Total runtime: 31725.674 ms (42 lignes)
QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=3126.79..3126.79 rows=1 width=728) (actual time=0.112..0.112 rows=0 loops=1) -> Nested Loop (cost=44.85..3126.79 rows=1 width=728) (actual time=0.108..0.108 rows=0 loops=1) -> Nested Loop Left Join (cost=44.85..3117.78 rows=1 width=571) (actual time=0.106..0.106 rows=0 loops=1) Join Filter: (residenced19_.residencetype_id = residencet22_.id) -> Nested Loop Left Join (cost=44.85..3116.58 rows=1 width=546) (actual time=0.104..0.104 rows=0 loops=1) -> Nested Loop (cost=44.85..3108.96 rows=1 width=530) (actual time=0.102..0.102 rows=0 loops=1) -> Nested Loop (cost=44.85..3101.06 rows=1 width=514) (actual time=0.100..0.100 rows=0 loops=1) -> Nested Loop (cost=44.85..3093.44 rows=1 width=292) (actual time=0.098..0.098 rows=0 loops=1) -> Hash Join (cost=44.85..3085.84 rows=1 width=132) (actual time=0.096..0.096 rows=0 loops=1) Hash Cond: (ace3_.eventinitiator_id = account6_.id) -> Seq Scan on adcreatedevent ace3_ (cost=0.00..2323.41 rows=149641 width=16) (actual time=0.030..0.030 rows=1 loops=1) -> Hash (cost=44.84..44.84 rows=1 width=116) (actual time=0.045..0.045 rows=0 loops=1) -> Nested Loop (cost=0.00..44.84 rows=1 width=116) (actual time=0.044..0.044 rows=0 loops=1) Join Filter: (account6_.contactinformation_id = contactinf7_.id) -> Nested Loop (cost=0.00..43.73 rows=1 width=55) (actual time=0.041..0.041 rows=0 loops=1) -> Seq Scan on contactinformation contactinf7_ (cost=0.00..1.05 rows=5 width=39) (actual time=0.005..0.014 rows=5 loops=1) -> Index Scan using cityid on city city8_ (cost=0.00..8.52 rows=1 width=16) (actual time=0.002..0.002 rows=0 loops=5) Index Cond: (contactinf7_.city_id = city8_.id) -> Seq Scan on account account6_ (cost=0.00..1.05 rows=5 width=61) (never executed) -> Index Scan using roommateresidenceofferadcreatedevent on roommateresidenceoffer this_ (cost=0.00..7.59 rows=1 width=160) (never executed) Index Cond: (this_.adcreatedevent_id = ace3_.id) -> Index Scan using residencedescription_pkey on residencedescription residenced19_ (cost=0.00..7.61 rows=1 width=222) (never executed) Index Cond: (this_.residencedescription_id = residenced19_.id) -> Index Scan using cityid on city city1_ (cost=0.00..7.88 rows=1 width=16) (never executed) Index Cond: (residenced19_.city_id = city1_.id) -> Index Scan using funalaevent_pkey on funalaevent ace3_1_ (cost=0.00..7.61 rows=1 width=16) (never executed) Index Cond: (ace3_.id = ace3_1_.id) -> Seq Scan on residencetype residencet22_ (cost=0.00..1.09 rows=9 width=25) (never executed) -> Index Scan using gisfeatureid on gisfeature gf2_ (cost=0.00..9.00 rows=1 width=157) (never executed) Index Cond: (city1_.associatedgisfeature_id = gf2_.id) Filter: (("location" && '0103000020E610000001000000050000009BC810BB85B8F83F01D42B98AA5D48409BC810BB85B8F83F4134414633804840D44ADA6E12F908404134414633804840D44ADA6E12F9084001D42B98AA5D48409BC810BB85B8F83F01D42B98AA5D4840'::geometry) AND (distance_sphere("location", '0101000020E6100000915731A6AAAA0240218436EFEE6E4840'::geometry) <= 15000::double precision)) Total runtime: 1.137 ms (32 lignes)
---------------------------(end of broadcast)--------------------------- TIP 2: Don't 'kill -9' the postmaster