<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=iso-8859-1">
<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:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@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 lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi all,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Currently OGROCITableLayer::GetExtent() calculates the cover by basically iterating over all of the features, either by using the min/max aggregate functions in the database, or by doing it with the features themselves.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The query being done currently looks like the following: <o:p>
</o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">SELECT<o:p></o:p></p>
<p class="MsoNormal">    MIN(SDO_GEOM.SDO_MIN_MBR_ORDINATE(t.SomeGeometryColumn ,m.DIMINFO,1)) AS MINX,<o:p></o:p></p>
<p class="MsoNormal">    MIN(SDO_GEOM.SDO_MIN_MBR_ORDINATE(t.SomeGeometryColumn, m.DIMINFO,2)) AS MINY,<o:p></o:p></p>
<p class="MsoNormal">    MAX(SDO_GEOM.SDO_MAX_MBR_ORDINATE(t.SomeGeometryColumn, m.DIMINFO,1)) AS MAXX,<o:p></o:p></p>
<p class="MsoNormal">    MAX(SDO_GEOM.SDO_MAX_MBR_ORDINATE(t.SomeGeometryColumn, m.DIMINFO,2)) AS MAXY<o:p></o:p></p>
<p class="MsoNormal">FROM ALL_SDO_GEOM_METADATA m, SomeOwner.SomeTable t<o:p></o:p></p>
<p class="MsoNormal">WHERE m.TABLE_NAME = UPPER('SomeTable')<o:p></o:p></p>
<p class="MsoNormal">    AND m.COLUMN_NAME = UPPER('SomeGeometryColumn')<o:p></o:p></p>
<p class="MsoNormal">    AND OWNER = UPPER('SomeOwner');<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I am trying to connect to a table that has around 50,000 rows, and that query with that particular table takes around 35 secs.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Given that the table has a spatial tree index, would it make more sense to simply get the root MBR of the spatial index:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">SELECT<o:p></o:p></p>
<p class="MsoNormal">    SDO_GEOM.SDO_MIN_MBR_ORDINATE(m.SDO_ROOT_MBR, 1) AS MINX,<o:p></o:p></p>
<p class="MsoNormal">    SDO_GEOM.SDO_MIN_MBR_ORDINATE(m.SDO_ROOT_MBR, 2) AS MINY,<o:p></o:p></p>
<p class="MsoNormal">    SDO_GEOM.SDO_MAX_MBR_ORDINATE(m.SDO_ROOT_MBR, 1) AS MAXX,<o:p></o:p></p>
<p class="MsoNormal">    SDO_GEOM.SDO_MAX_MBR_ORDINATE(m.SDO_ROOT_MBR, 2) AS MAXY<o:p></o:p></p>
<p class="MsoNormal">FROM ALL_SDO_INDEX_METADATA m, ALL_SDO_INDEX_INFO i<o:p></o:p></p>
<p class="MsoNormal">WHERE i.INDEX_NAME = m.SDO_INDEX_NAME<o:p></o:p></p>
<p class="MsoNormal">    AND i.SDO_INDEX_OWNER = m.SDO_INDEX_OWNER<o:p></o:p></p>
<p class="MsoNormal">    AND i.TABLE_NAME = UPPER('SomeTable')<o:p></o:p></p>
<p class="MsoNormal">    AND i.COLUMN_NAME = UPPER('SomeGeometryColumn')<o:p></o:p></p>
<p class="MsoNormal">    AND i.TABLE_OWNER = UPPER('SomeOwner');<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">That query is pretty much instantaneous and gives me the same exact result.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The main issue that I see is that there isn’t any guarantee that the spatial index is completely up-to-date, so it could not give the same result. One option would be to do the same as the PostgreSQL driver and only do the quick query if
 force is set to false. I’d also would be open to adding a configuration option to use the root MBR instead of the current behavior.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thoughts?<o:p></o:p></p>
<p class="MsoNormal">Andre<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>