<div dir="ltr"><div dir="ltr"><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
I think the best route forward (and please feel free to argue) is a whole 'nother opclass, gist_geometry_ops_2d_fastbuild, so that people can build a "fast to create but suboptimal to query" tree and all they need is to know the one magic keyword to get it. Also that way "fast'n'suboptimal" trees can coexist with "slow'n'good" trees and people don't have to constantly flip the sort-support option of the default index opclass back and forth.<br></blockquote><div><br></div><div><br></div><div>What I don't want is to get legacy APIs that we know how to remove. I say if it is not the default method this year, then make the ALTER OPERATOR CLASS the trick for now for people who need it, and aim at enabling it by default next year with Postgres 15 improvements.</div><div><br></div><div>People who need it are middle class openstreetmap enthusiasts who want to play with openstreetmap data with osm2pgsql but they also have a life and sometimes turn off their computer at night. Planet scale osm2pgsql can take a weekend easily, and index building is the most frustrating part of it. These are the same people who will appreciate 2x smaller indexes.</div><div><br></div><div>This whole "space-filling curve indexing" endeavour started in 2.4 with btree z-curve opclass and has been improving ever since. Current best option to get such indexing is via ORDER BY geom and a BRIN. Right now we've gone up the situation where Postgres does not provide enough/proper infrastructure to implement the things we need.</div><div><br></div><div>The plan is:<br> - get feature out as an ALTER OPERATOR CLASS so Postgres people can play with it not on their toy datatypes. </div><div> - build benchmark for the case so people on postgres side know what we need [done, thanks Paul],</div><div> - on postgres side, fix the leaf page sort to be not by Hilbert key but by tid, so there's disk locality in search (issue found by Han),<br> - on postgres side, implement tree balancing via picksplit. I suspect that a good implementation will need at least one new function on our side, a box2df overlap estimator - which is similar but not exactly inverse of penalty.</div><div>Two above points discussed on pgsql-hackers:</div><div><a href="https://www.postgresql.org/message-id/E5F64198-C592-4916-873E-74E33A7A935A@yandex-team.ru">https://www.postgresql.org/message-id/E5F64198-C592-4916-873E-74E33A7A935A@yandex-team.ru</a> </div><div><br></div><div> - after the above is done, I expect that the previous performance of gist can be replicated via creation of index with fillfactor=50. I consider the current implementation not being able to pack the tree to the required fillfactor of 100 a bug really. </div><div><br></div><div>In the creation of <span style="">gist_geometry_ops_2d_fastbuild we will deprecate that in 3.3 if all goes well in the above which does not seem great. </span></div><div><span style=""><br></span></div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
P.<br>
<br>
> On Nov 30, 2021, at 10:28 AM, Paul Ramsey <<a href="mailto:pramsey@cleverelephant.ca" target="_blank">pramsey@cleverelephant.ca</a>> wrote:<br>
> <br>
> Here's a more zoomed in view. I think the hilbert curve is causing a lot of less-than-optimal overlap in the parent nodes<br>
> <screenshot_770.png><screenshot_769.png><br>
> <br>
>> On Nov 30, 2021, at 10:20 AM, Paul Ramsey <<a href="mailto:pramsey@cleverelephant.ca" target="_blank">pramsey@cleverelephant.ca</a>> wrote:<br>
>> <br>
>> I got gevel working on Pg14, and here's some pictures of the top two levels of the index. Blue is the 3.2 sort-support index, red is the 3.1 standard index. <br>
>> <br>
>> <screenshot_768.jpg><screenshot_766.jpg><br>
>> <br>
>>> On Nov 30, 2021, at 9:23 AM, Martin Davis <<a href="mailto:mtnclimb@gmail.com" target="_blank">mtnclimb@gmail.com</a>> wrote:<br>
>>> <br>
>>> 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).<br>
>>> <br>
>>> 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.<br>
>>> <br>
>>> Of course, any reindex of the table will pack the index again, resulting in the observed query performance hit.<br>
>>> <br>
>>> <br>
>>> On Tue, Nov 30, 2021 at 8:43 AM Bruce Rindahl <<a href="mailto:bruce.rindahl@gmail.com" target="_blank">bruce.rindahl@gmail.com</a>> wrote:<br>
>>> 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.<br>
>>> <br>
>>> 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>
>>> <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>
>>> _______________________________________________<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>
<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></div>