More performance news...
Using ogrinfo -> VRT -> ODBC -> SqlServer2000, the query using:
   <SrcLayer>alta83_v1</SrcLayer>
        - takes less than 2 seconds

   <SrcSQL>Select * from alta83_v1</SrcSQL>
        - a very simple select, logically equivalent to the above
        - takes 30 seconds (!)

From the debug messages below, it seems that the spatial filter is not passed to the 
database server if a <SrcSQL> is included in the VRT.  Not too surprising given 
the difficultly of parsing a SELECT statement and rebuilding it with additional 
clauses, but we should mention the order of magnitude performance hit in the doc.

And I'm not sure why ogr seems to execute the SQL three times...

Thanks!
Brent

=================================
<SrcLayer>alta83_v1</SrcLayer>:
---------------------------------
G:\GeoData\Wells>ogrinfo -spat -114 51 -113 52 -ro --debug ON all_wells.ovf 
wells | more
OGR_ODBC: EstablishSession(DSN:"Wells_SQL", userid:"test", password:"test")
ODBC: SQLConnect(Wells_SQL)
OGR_ODBC: Table alta83_v1 has no identified FID column.
OGR: OGROpen(ODBC:test/t...@wells_sql,alta83_v1/00C846D0) succeeded as ODBC.
OGR: OGROpen(all_wells.ovf/00C83B60) succeeded as VRT.
OGR: GetLayerCount() = 1

OGR_ODBC: ExecuteSQL(SELECT * FROM alta83_v1 WHERE BOT_LONG > -114 AND BOT_LONG < 
-113 AND BOT_LAT > 51 AND BOT_LAT < 52)
OGR_ODBC: ExecuteSQL(SELECT * FROM alta83_v1 WHERE BOT_LONG > -114 AND BOT_LONG < 
-113 AND BOT_LAT > 51 AND BOT_LAT < 52)
OGR_ODBC: ExecuteSQL(SELECT * FROM alta83_v1 WHERE BOT_LONG > -114 AND BOT_LONG < 
-113 AND BOT_LAT > 51 AND BOT_LAT < 52)
INFO: Open of `all_wells.ovf'
     using driver `VRT' successful.

========================================
<SrcSQL>Select * from alta83_v1</SrcSQL>
----------------------------------------
G:\GeoData\Wells>ogrinfo -spat -114 51 -113 52 -ro --debug ON all_wells.ovf 
wells | more
OGR_ODBC: EstablishSession(DSN:"Wells_SQL", userid:"test", password:"test")
ODBC: SQLConnect(Wells_SQL)
OGR_ODBC: Table alta83_v1 has no identified FID column.
OGR: OGROpen(ODBC:test/t...@wells_sql,alta83_v1/00C846D0) succeeded as ODBC.
ODBC: ExecuteSQL(Select * from alta83_v1) called.
OGR_ODBC: Table SELECT has no identified FID column.
OGR: OGROpen(all_wells.ovf/00C83B60) succeeded as VRT.
OGR: GetLayerCount() = 1

OGR_ODBC: Recreating statement.
OGR_ODBC: Recreating statement.
INFO: Open of `all_wells.ovf'
     using driver `VRT' successful.



Brent Fraser wrote:
Frank,

Interesting. I'm attempting to use Mapserver -> OGR -> VRT -> ODBC -> SqlServer2000 -> a table of 250k rows of point features.

Testing with ogrinfo to return all the rows takes about 25 seconds, but with a "-spat" to get about 3000 rows takes < 2 seconds (very acceptable). And I didn't need to create a view with XMIN,YMIN,XMAX,YMAX as implied on GDAL's ODBC format page; OGR applied the filter to the point coordinate columns (dunno what it would do with lines or polygons and no min/max columns though).

Looking at mapserver's mapogr.cpp, it appears that OGR_L_SetSpatialFilter is being called, so I'll have to do some more tracing/debugging to find out why my mapserver performance is so bad with this layer.

Thanks!
Brent Fraser

Frank Warmerdam wrote:
Brent Fraser wrote:
Hi All,

In the case of accessing data in a relational database, does OGR have the ability to pass a spatial extent to the database to use as a filter on the geometry before sending the rows?

Brent,

Yes. The OGRLayer has a SetSpatialFilter() method for this. Some drivers
evaluate the spatial filter in OGR after reading all records, but smart
drivers are able to use the spatial filter for efficient querying. So, the
spatially enabled databases work it into the query.

The -spat switch for ogrinfo is translated into a SetSpatialFilter() call
for instance.

Best regards,
_______________________________________________
gdal-dev mailing list
gdal-dev@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/gdal-dev

_______________________________________________
gdal-dev mailing list
gdal-dev@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/gdal-dev

Reply via email to