2

最初,我试图找出为什么在像这样的单个 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 文档中找到了这一段:

尽管可以使用逻辑布尔运算符 OR 组合多个掩码,例如,'mask=touch+coveredby',但如果空间查询单独指定每个掩码并使用 UNION ALL 语法组合结果,则可能会产生更好的性能。这是由于内部优化,当单独指定掩码而不是在同一 SDO_RELATE 运算符调用中分组时,Spatial 可以在某些条件下应用。(有两个例外,inside+coveredby 和 contains+covers,其中组合的性能优于 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';

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

  1. “内部优化”是什么意思,与空间索引有关吗?(不知道是不是对这个问题要求太高了,可能只有oracle的开发者才知道。)

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

4

0 回答 0