<div dir="ltr">Just to get some clarity about how this works - the sorting/packing only happens when an index is created, right?  So insert/update records are added to the index in the normal way (i.e the same way the old code uses to build the index in the first place).<div><br></div><div>If so, will a packed index "fluff up" as more records are added?  Which should (slowly) bring query performance back in line with the standard index approach.</div><div><br></div><div>Of course, any reindex of the table will pack the index again, resulting in the observed query performance hit.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Nov 30, 2021 at 8:43 AM Bruce Rindahl <<a href="mailto:bruce.rindahl@gmail.com">bruce.rindahl@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">I have to agree with Paul on this.  Indexes are usually created once but queries are done all the time.  The only benefit would be to a spatial dataset that is constantly updated.  Even then the update performance increase (if it happens) might be small compared to the query performance.  Most applications would do a massive bulk load (OSM data) then index, then constant queries.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Nov 30, 2021 at 8:08 AM Paul Ramsey <<a href="mailto:pramsey@cleverelephant.ca" target="_blank">pramsey@cleverelephant.ca</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
<br>
> On Nov 29, 2021, at 11:03 PM, Marco Boeringa <<a href="mailto:marco@boeringa.demon.nl" target="_blank">marco@boeringa.demon.nl</a>> wrote:<br>
> <br>
> Hi Paul,<br>
> <br>
> Thanks for these insights. In fact, seeing some of the similar discussions in the past about build time versus query performance when Han was still working on this project, was one of the reasons I initially asked about this here on the list, and asked about real world experiences with the new versions of PostgreSQL and PostGIS.<br>
> <br>
> However, your remark about "flat trees" raises another question for me:<br>
> <br>
> - Is the issue you describe data size depended or not? E.g. does the 50% penalty on query performance possibly only occur on small datasets, but not - or much less so - on something like a Planet size extract of OpenStreetMap? Or is this a universal issue?<br>
<br>
Note that, with optimal page filling (which the flatter trees get close to) you can fit a 250000 record table into an index with only 2 levels. These aren't just a little flat, they are really flat.<br>
I also tested with a 2.7M record table and found the sort-support index ran 30% slower. My mental model, which may be wrong, says that the lower levels of the tree tend to be the most full, so "smaller" tables (under a quarter million records!) bear the brunt of the downgrade, but even larger tables see it.<br>
<br>
> Having a 50% decrease in query performance of primarily small datasets might be acceptable,<br>
<br>
Uh, 100% abosutely not. Querying is something the database does all day, every day, so every inefficiency is multiplied over all the queries that are run on the table For All Time. Bulk indexing is something that happens Once.<br>
<br>
There is no way that we should push this kind of regression out as the default setting. Either we should make a whole other "fast to build but slow to query" opclass or just leave the sort-support out of the opclass and let people with the "index build time is my constraint" people manually add the sort support function to the default opclass.<br>
<br>
P<br>
<br>
> if it means much larger datasets can be indexed much faster and have minimal impact of the same issue. That said, I understand your caution if the 50% decrease in query performance is a universal issue with the new implementation.<br>
> <br>
> Marco<br>
> <br>
> Op 30-11-2021 om 00:08 schreef Paul Ramsey:<br>
>> Sorry to be the rain on the parade, but I think that the results of testing on performance for the new index sorting mean we should NOT be enabling it by default for this release.<br>
>> <br>
>> Basically we have multiple tests now that show that the index is slower for query performance, and we even have a convincing working theory for why (the improved packing into pages/nodes means that we have very flat trees which are expensive to query).<br>
>> <br>
>> I think releasing with a "new improved" version that degrades most people's systems by 50% is not a good look. We can leave all the code in there and just take the sorting function out of the opclass. That way people with "build an index and use it once" use cases can still turn the feature on, but people with normal use patterns aren't going to silently get a kick in the teeth when they upgrade to 3.2.<br>
>> <br>
>> If you would like to replicate my results, I provide them below.<br>
>> <br>
>> P.<br>
>> <br>
>> <br>
>> Data: <a href="https://www.dropbox.com/s/e75g1y9ua1da6qu/roads_rdr.sql.gz?dl=0" rel="noreferrer" target="_blank">https://www.dropbox.com/s/e75g1y9ua1da6qu/roads_rdr.sql.gz?dl=0</a><br>
>> <br>
>> create index roads_rdr_idx on roads_rdr using gist (geom);<br>
>> <br>
>> 13/3.2/CREATE 1546<br>
>> 13/3.1/CREATE 1683<br>
>> 14/3.2/CREATE 200<br>
>> 14/3.1/CREATE 1705<br>
>> <br>
>> select count(*) from roads_rdr a, roads_rdr b where a.geom && b.geom;<br>
>> <br>
>> 13/3.2/QUERY  4600<br>
>> 13/3.1/QUERY 4540<br>
>> 14/3.2/QUERY 11200<br>
>> 14/3.1/QUERY 4700<br>
>> <br>
>> select pg_relation_size('roads_rdr_idx');<br>
>> <br>
>> 13/3.2/IDXSIZE  5414912<br>
>> 13/3.1/IDXSIZE 5496832<br>
>> 14/3.2/IDXSIZE 2940928<br>
>> 14/3.1/IDXSIZE 5439488<br>
>> _______________________________________________<br>
>> postgis-devel mailing list<br>
>> <a href="mailto:postgis-devel@lists.osgeo.org" target="_blank">postgis-devel@lists.osgeo.org</a><br>
>> <a href="https://lists.osgeo.org/mailman/listinfo/postgis-devel" rel="noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/postgis-devel</a><br>
> _______________________________________________<br>
> postgis-devel mailing list<br>
> <a href="mailto:postgis-devel@lists.osgeo.org" target="_blank">postgis-devel@lists.osgeo.org</a><br>
> <a href="https://lists.osgeo.org/mailman/listinfo/postgis-devel" rel="noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/postgis-devel</a><br>
<br>
_______________________________________________<br>
postgis-devel mailing list<br>
<a href="mailto:postgis-devel@lists.osgeo.org" target="_blank">postgis-devel@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/postgis-devel" rel="noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/postgis-devel</a><br>
</blockquote></div>
_______________________________________________<br>
postgis-devel mailing list<br>
<a href="mailto:postgis-devel@lists.osgeo.org" target="_blank">postgis-devel@lists.osgeo.org</a><br>
<a href="https://lists.osgeo.org/mailman/listinfo/postgis-devel" rel="noreferrer" target="_blank">https://lists.osgeo.org/mailman/listinfo/postgis-devel</a><br>
</blockquote></div>