最初,我试图找出为什么在单个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可以在某些条件下应用”。所以我有两个问题:
“内部优化”是什么意思,是否与空间索引有关? (我不确定我是否对这个问题要求太高,也许只有oracle的开发人员才知道它。)
oracle文档没有说明我原来的问题,即单个SELECT中的SDO_RELATE(...,'mask = inside')和SDO_RELATE(...,'maks = anyinteract')。为什么它的性能也很差?它是否与SDO_RELATE(...,'mask = inside + anyinteract')类似?