Oracle Spatial SDO_RELATE:为什么UNION ALL / INTERSECT组合单个指定掩码的性能更好

时间:2013-08-21 06:49:32

标签: database oracle geospatial

最初,我试图找出为什么在单个SELECT语句中使用多个SDO_REALTE进行空间查询的速度太慢,如下所示:

SELECT * FROM geom_table a 
WHERE SDO_RELATE(a.geom_column, SDO_GEOMETRY(...), 'mask=inside')='TRUE' AND
SDO_RELATE(a.geom_column, SDO_GEOMETRY(...), 'mask=anyinteract')='TRUE';

注意两个SDO_GEOMETRY可能没有必要相同。所以它与SDO_GEOMETRY(a.geom_column,the_same_geometry,'mask = inside + anyinteract')='TRUE'

有点不同

然后我从SDO_RELATE的oracle文档中找到了this paragraph

  

虽然可以使用逻辑布尔组合多个蒙版   运算符OR,例如'mask = touch + coveredby',性能更好   如果空间查询单独指定每个掩码,则可能会导致   使用UNION ALL语法来组合结果。这是因为   Spatial可以在某些条件下应用的内部优化   当单独指定掩码而不是在同一掩码中分组时   SDO_RELATE运算符调用。 (有两个例外,内部+覆盖   并包含+封面,其中组合表现优于   UNION ALL替代方案。)例如,请考虑使用逻辑的以下查询   布尔运算符OR对多个掩码进行分组:

SELECT a.gid   FROM polygons a, query_polys B   WHERE B.gid = 1   AND
SDO_RELATE(A.Geometry, B.Geometry,
                   'mask=touch+coveredby') = 'TRUE';
     

如果是,前面的查询可能会带来更好的性能   表达如下,使用UNION ALL组合多个结果   SDO_RELATE运算符调用,每个调用都有一个掩码:

SELECT a.gid
      FROM polygons a, query_polys B
      WHERE B.gid = 1
      AND SDO_RELATE(A.Geometry, B.Geometry,
                   'mask=touch') = 'TRUE' UNION ALL SELECT a.gid
      FROM polygons a, query_polys B
      WHERE B.gid = 1
      AND SDO_RELATE(A.Geometry, B.Geometry,
                   'mask=coveredby') = 'TRUE';

它以某种方式为我的问题提供了答案,但它仍然只说:“由于内部优化,Spatial可以在某些条件下应用”。所以我有两个问题:

  1. “内部优化”是什么意思,是否与空间索引有关? (我不确定我是否对这个问题要求太高,也许只有oracle的开发人员才知道它。)

  2. oracle文档没有说明我原来的问题,即单个SELECT中的SDO_RELATE(...,'mask = inside')和SDO_RELATE(...,'maks = anyinteract')。为什么它的性能也很差?它是否与SDO_RELATE(...,'mask = inside + anyinteract')类似?

0 个答案:

没有答案