<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;
        color:black;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;
        color:black;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body bgcolor=white lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'>Bill,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'>I meant to change to <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'><o:p> </o:p></span></p><p class=MsoPlainText>e.geom && ST_SetSRID(ST_MakePoint(longitude,<o:p></o:p></p><p class=MsoPlainText>latitude), 4326))  AND _ST_Contains(e.geom ,ST_SetSRID(ST_MakePoint(longitude,<o:p></o:p></p><p class=MsoPlainText>latitude), 4326))<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>ST_Contains  is just a wrapper for  &&  and _ST_contains.  The && part usually gets done first so is broken apart by the planner to push that into the index.<o:p></o:p></p><p class=MsoPlainText>In your case that's not happening for some reason.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Why it's not automatically breaking apart is a bit concerning.  Would you be able to provide some sample data that exhibits the problem and file a ticket?  <a href="http://postgis.net/support/">http://postgis.net/support/</a><o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>If it's private data, you can just send to me.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Thanks,<o:p></o:p></p><p class=MsoPlainText>Regina<o:p></o:p></p><p class=MsoPlainText><a href="http://www.postgis.us">http://www.postgis.us</a><o:p></o:p></p><p class=MsoPlainText><a href="http://postgis.net">http://postgis.net</a><o:p></o:p></p><p class=MsoPlainText>PostGIS PSC Member<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal style='margin-left:.5in'><b><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:windowtext'>From:</span></b><span style='font-size:11.0pt;font-family:"Calibri",sans-serif;color:windowtext'> postgis-users [mailto:postgis-users-bounces@lists.osgeo.org] <b>On Behalf Of </b>Bill Measday<br><b>Sent:</b> Friday, December 02, 2016 1:45 AM<br><b>To:</b> postgis-users@lists.osgeo.org<br><b>Subject:</b> Re: [postgis-users] Substantial different index use between 9.5 and 9.6 using Postgis<o:p></o:p></span></p></div></div><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p><p style='margin-left:.5in'>2 things<o:p></o:p></p><p style='margin-left:.5in'>First, unfortunately the full query doesn't work as in some cases the subquery returns more than one row.  Not sure why, as the geom should be a rectangle (more or less given the projection, but was created from 4 points), but maybe right near the boundary there are issues (on reflection I guess the north/south edges are not quite parallel).<o:p></o:p></p><p style='margin-left:.5in'>Second - I forgot to complete part of my response.  Should have said <o:p></o:p></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal style='mso-margin-top-alt:0in;margin-right:0in;margin-bottom:12.0pt;margin-left:.5in'>Second, you lost me a little with your second suggestion.  As I gather _st_contains explicitly avoids the index, so the explain still uses the sequential scan.  I assume I'm misunderstanding your suggestion.<o:p></o:p></p></blockquote><p class=MsoNormal style='margin-left:.5in'>Rgds<br><br>Bill<o:p></o:p></p><div><p class=MsoNormal style='margin-left:.5in'>On 2/12/2016 5:29 PM, Bill Measday wrote:<o:p></o:p></p></div><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal style='margin-left:.5in'>Thanks Regina, <br><br>First, your first suggestion didn't seem to achieve anything - even the costs in the explain remained the same (1e10). <br><br>Second, you lost me a little with your second suggestion.  As I gather _st_contains explicitly avoids the index. <br><br>Tried <br><br>explain SELECT address_default_geocode_pid, <br>    (SELECT elevation FROM m_elevations e WHERE e.geom && ST_SetSRID(ST_MakePoint(longitude, latitude), 4326)), <br>    ST_SetSRID(ST_MakePoint(latitude, longitude), 4283) <br>     FROM address_default_geocode <br>     WHERE latitude = -33.87718472 AND longitude = 151.27544336; <br><br>(ie changed WHERE ST_Contains(e.geom, ST_SetSRID(ST_MakePoint(longitude, latitude), 4326)) to WHERE e.geom && ST_SetSRID(ST_MakePoint(longitude, latitude), 4326)) <br><br>and that seems to have done the trick.  Tee explain now uses the index and the actual query seems more or less on par with the version run under 9.5. <br><br>Odd though, but thank you very much for the help/solution.  Now I'll try the full insert query. <br><br>Regards <br><br>Bill <br><br><br>On 2/12/2016 3:48 PM, Regina Obe wrote: <br><br><o:p></o:p></p><blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><p class=MsoNormal style='margin-left:.5in'>I have seen this on rare occasions in past but not recently where the planner doesn't break apart the ST_Contains or ST_Intersects into the component steps. <br>We made some changes to costing in 2.3.0, but ST_Contains (and _ST_Contains) wasn't one of them so that doesn't quite explain this. <br>Couple of things to try <br><br>1) On the _ST_Contains function in set the cost to something higher like 1000: <br><br>CREATE OR REPLACE FUNCTION _st_contains(geom1 geometry, geom2 geometry) RETURNS boolean AS <br>'$libdir/postgis-2.3', 'contains' <br>LANGUAGE c IMMUTABLE STRICT <br>COST 1000; <br><br>And then try your query again/ <br><br><br>2) If Item 1 doesn't work what happens if you explicitly put in && and _ST_Contains <br><br>That should force the index to kick in. <br><br><br>-----Original Message----- <br>From: postgis-users [<a href="mailto:postgis-users-bounces@lists.osgeo.org">mailto:postgis-users-bounces@lists.osgeo.org</a>] On Behalf Of Bill Measday <br>Sent: Thursday, December 01, 2016 7:47 PM <br>To: <a href="mailto:postgis-users@lists.osgeo.org">postgis-users@lists.osgeo.org</a> <br>Subject: [postgis-users] Substantial different index use between 9.5 and 9.6 using Postgis <br><br>This is a post I put on the potgres performance list.  They suggested I take it up on the PostGis list <br><br>Postgres versions 9.5.4 and 9.6.0 running on Windows Server 2012. <br>Installed using EnterpriseDB. Both instances are on the same server, postgresql.conf for both are the same except max_locks_per_transaction = <br>200 in 9.6 (caused insertion errors otherwise). <br><br>On 9.5: <br>geo=# SELECT PostGIS_full_version(); <br>postgis_full_version <br><br>------------------------------------------------------------------------------------------------------------------------------------------------------------------- <br>   POSTGIS="2.2.2 r14797" GEOS="3.5.0-CAPI-1.9.0 r4090" PROJ="Rel. 4.9.1, <br>04 March 2015" GDAL="GDAL 2.0.2, released 2016/01/26" LIBXML="2.7.8" <br>LIBJSON="0.12" RASTER <br>(1 row) <br><br>   On 9.6: <br><br>postgis_full_version <br><br>------------------------------------------------------------------------------------------------------------------------------------------------------------------- <br>   POSTGIS="2.3.0 r15146" GEOS="3.5.0-CAPI-1.9.0 r4090" PROJ="Rel. 4.9.1, <br>04 March 2015" GDAL="GDAL 2.1.1, released 2016/07/07" LIBXML="2.7.8" <br>LIBJSON="0.12" RASTER <br>(1 row) <br><br>Databases on the 2 instances are the same (as far as I can tell). <br><br>I have 2 relevant tables (created using same script in both instances, except I added an auto increment RID to the 9.6 version as primary key to the larger of the 2 tables - other already had one). One contains a geometry column (geom geometry(1107464) - a polygon) with  gist index. <br>This table has around 10 billion records. The disks these databases on aren't particularly fast, and indexing took about a week. <br>Second table has latitude (numeric(10, 8)), and longitude (numeric(11, <br>8)) and about 10 million records. <br><br>The query I'm running is (a part of an insertion into a new table I was trying to run) <br>      SELECT address_default_geocode_pid, <br>      (SELECT elevation FROM m_elevations e WHERE ST_Contains(e.geom, ST_SetSRID(ST_MakePoint(longitude, latitude), 4326))), <br>      ST_SetSRID(ST_MakePoint(latitude, longitude), 4283) <br>       FROM address_default_geocode; <br><br>Under 9.5 the insertion takes about 11 hours. I gave up on 9.6. <br><br>I thought I'd try just one record, so: <br><br>SELECT address_default_geocode_pid, <br>      (SELECT elevation FROM m_elevations e WHERE ST_Contains(e.geom, ST_SetSRID(ST_MakePoint(longitude, latitude), 4326))), <br>      ST_SetSRID(ST_MakePoint(latitude, longitude), 4283) <br>       FROM address_default_geocode <br>       WHERE latitude = -33.87718472 AND longitude = 151.27544336; <br><br>This returns 3 rows (which is more than the average I'd expect BTW). On <br>9.5 takes a few seconds (3-5) and again I gave up on 9.6 <br><br>Looking just at the query shown above, I note a difference in explained behaviour.  Here is the output from 9.5: <br><br>      QUERY PLAN <br><br>----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- <br>   Seq Scan on address_default_geocode  (cost=0.00..37760293.94 rows=1 <br>width=25) <br>     Filter: ((latitude = '-33.87718472'::numeric) AND (longitude = <br>151.27544336)) <br>     SubPlan 1 <br>       ->  Bitmap Heap Scan on m_elevations e <br>(cost=282802.21..37401439.43 rows=3512160 width=8) <br>             Recheck Cond: (geom ~ <br>st_setsrid(st_makepoint((address_default_geocode.longitude)::double <br>precision, (address_default_geocode.latitude)::double precision), 4326)) <br>             Filter: _st_contains(geom, <br>st_setsrid(st_makepoint((address_default_geocode.longitude)::double <br>precision, (address_default_geocode.latitude)::double precision), 4326)) <br>             ->  Bitmap Index Scan on m_elevations_geom_idx <br>(cost=0.00..281924.17 rows=10536480 width=0) <br>                   Index Cond: (geom ~ <br>st_setsrid(st_makepoint((address_default_geocode.longitude)::double <br>precision, (address_default_geocode.latitude)::double precision), 4326)) <br>(8 rows) <br><br>  From 9.6 <br><br>      QUERY PLAN <br><br>---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- <br>   Seq Scan on address_default_geocode <br>(cost=10000000000.00..23297309357.08 rows=1 width=49) <br>     Filter: ((latitude = '-33.87718472'::numeric) AND (longitude = <br>151.27544336)) <br>     SubPlan 1 <br>       ->  Seq Scan on m_elevations e <br>(cost=10000000000.00..13296950520.12 rows=3512159563 width=8) <br>             Filter: st_contains(geom, <br>st_setsrid(st_makepoint((address_default_geocode.longitude)::double <br>precision, (address_default_geocode.latitude)::double precision), 4326)) <br>(5 rows) <br><br>Interestingly (change is hard coding of coordinates in second line): <br><br>explain SELECT address_default_geocode_pid, <br>      (SELECT elevation FROM m_elevations e WHERE ST_Contains(e.geom, <br>ST_SetSRID(ST_MakePoint(151.27544336, -33.87718472), 4326))), <br>      ST_SetSRID(ST_MakePoint(latitude, longitude), 4283) <br>       FROM address_default_geocode <br>       WHERE latitude = -33.87718472 AND longitude = 151.27544336; <br><br>Gives (in 9.6) <br><br>                                                 QUERY PLAN <br><br>-------------------------------------------------------------------------------------------------------- <br>   Seq Scan on address_default_geocode <br>(cost=10037428497.36..10037787334.33 rows=1 width=49) <br>     Filter: ((latitude = '-33.87718472'::numeric) AND (longitude = <br>151.27544336)) <br>     InitPlan 1 (returns $0) <br>       ->  Bitmap Heap Scan on m_elevations e <br>(cost=272194.20..37428497.36 rows=3512160 width=8) <br>             Recheck Cond: (geom ~ <br>'0101000020E610000036E3976ED0E86240B879C29647F040C0'::geometry) <br>             Filter: _st_contains(geom, <br>'0101000020E610000036E3976ED0E86240B879C29647F040C0'::geometry) <br>             ->  Bitmap Index Scan on m_elevations_geom_idx <br>(cost=0.00..271316.16 rows=10536480 width=0) <br>                   Index Cond: (geom ~ <br>'0101000020E610000036E3976ED0E86240B879C29647F040C0'::geometry) <br>(8 rows) <br><br>Which looks better. <br><br>So for some reason, 9.6 planner decides not to use the index for a small <br>number of records returned from address_default_geocode. <br>I have vacuum analysed both tables. <br>Clearly a sequential scan on 10 billion records is pretty slow (to say <br>the least). <br><br>Has anyone seen anything like this/got any thoughts? <br><br>I tried "set enable_seqscan=false" but didn't seem to have any effect. <br><br>Regards <br><br>Bill <br>_______________________________________________ <br>postgis-users mailing list <br><a href="mailto:postgis-users@lists.osgeo.org">postgis-users@lists.osgeo.org</a> <br><a href="http://lists.osgeo.org/mailman/listinfo/postgis-users">http://lists.osgeo.org/mailman/listinfo/postgis-users</a> <br><br>_______________________________________________ <br>postgis-users mailing list <br><a href="mailto:postgis-users@lists.osgeo.org">postgis-users@lists.osgeo.org</a> <br><a href="http://lists.osgeo.org/mailman/listinfo/postgis-users">http://lists.osgeo.org/mailman/listinfo/postgis-users</a> <o:p></o:p></p></blockquote><p class=MsoNormal style='margin-left:.5in'><br>_______________________________________________ <br>postgis-users mailing list <br><a href="mailto:postgis-users@lists.osgeo.org">postgis-users@lists.osgeo.org</a> <br><a href="http://lists.osgeo.org/mailman/listinfo/postgis-users">http://lists.osgeo.org/mailman/listinfo/postgis-users</a><o:p></o:p></p></blockquote><p class=MsoNormal style='margin-left:.5in'><o:p> </o:p></p></div></body></html>