Hi all,
I continue to bang along towards a binding of the spgist api from a run-time 
extension (postgis, in this case).
To avoid complication, I am actually not doing any postgis code at this point, 
just copying the internal point quadtree implementation and seeing if I can get 
it to turn over.

My C implementation is here 
https://github.com/pramsey/postgis/blob/spgist/postgis/gserialized_spgist_2d.c
My SQL binding calls are here 
https://github.com/pramsey/postgis/blob/spgist/postgis/gserialized_spgist_2d.sql

Thanks to help from Andres Freund, I can now build an index based on my 
extension. However, when I run a query using the operator(s) I have defined, 
the query never uses my index, it always sequence scans.

explain analyze select * from somepoints where 
'(5898.82450178266,7990.24286679924)'::point = pt;
                                                 QUERY PLAN                     
                            
------------------------------------------------------------------------------------------------------------
 Seq Scan on somepoints  (cost=0.00..1887.00 rows=100 width=20) (actual 
time=26.675..26.675 rows=0 loops=1)
   Filter: ('(5898.82450178266,7990.24286679924)'::point = pt)
   Rows Removed by Filter: 100000
 Total runtime: 26.743 ms


If I build an index on the same table using the internal quad-tree ops, and use 
their operator, I do get an index scan.

The database is recognizing that the index is there, and if I put a breakpoint 
on the spgist ‘config’ API function, I see it getting turned over as the query 
starts and the planner looks at things, but none of the other hooks get called, 
and the plan ends up being a sequence scan every time.

So, the system knows the index exists, it just thinks it is irrelevant to the 
query. The system also knows my operators exist, and uses them (in sequence 
scan mode). But even though they are bound into strategies declared for the 
operator class, the index is not getting used.

I’ve poked around looking at all the places I can in the system catalogue to 
try and find out what might differ between my index and the internal quad-tree, 
but no luck so far: they seem to be defined exactly the same.

Presumably I’ve again forgotten something simple-yet-crucial in my attempt to 
bind this access method to the point type: any suggestions for fixes or at 
least diagnostics I can run to get more clues?

Thanks,

P


-- 
Paul Ramsey
http://cleverelephant.ca
http://postgis.net

Reply via email to