使用sdo_nn运算符的空间Oracle查询

时间:2016-07-13 13:24:36

标签: oracle indexing spatial

我正在从下面的查询(查询1)计算两个2点之间的距离(使用他们的gps坐标)。我的表的一列存储了point1的geo_location,point2的位置被动态地提供给bind变量。查询工作正常,并给我point1和point2之间的确切距离。但是,无论何时执行此查询,我都会看到数据库服务器上的CPU利用率很高(有时从60%到95%)。当我尝试扫描AWR报告时,我发现有一个内部触发的另一个查询(下面的查询2),此查询扫描表中的每一行(每次执行Query1),而不管where子句(我正在寻找)对于只有必须计算距离的特定文本的行)! 我试过将文本搜索作为子查询(Query3),所以这个sdo_nn只在这个子集上运行但是徒劳无功。如果表中有15k记录,并且如果查询1执行2k次,那么来自AWR的查询2的执行次数是15k * 2k次! 我正在使用Oracle 11g。请求您的帮助。我是否正确实现了sdo_nn功能?有什么方法可以实现以避免Query2?

Query1:
SELECT geo_location, Sdo_Nn_Distance (1) distance FROM my_table a WHERE SDO_NN(a.GEO_LOCATION, SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE (:7 , :8 , NULL), NULL, NULL), 1) = 'TRUE') AND (contains(a.col1, :9 ) > 0 ORDER BY DISTANCE;

上述查询中的绑定变量表示:

:7个经度输入

:8个纬度输入

:9个搜索文本输入

Query2:
SELECT a."GEO_LOCATION" FROM my_table a where a.rowid=:rid 

Query3:
SELECT geo_location, Sdo_Nn_Distance (1) distance FROM my_table a WHERE SDO_NN(a.GEO_LOCATION, SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE (:7 , :8 , NULL), NULL, NULL), 1) = 'TRUE') AND a.col1 in (select col1 from my_table where (contains(a.col1, :9 ) > 0) ORDER BY DISTANCE;

1 个答案:

答案 0 :(得分:1)

为了读者,我再次发布这个答案:解决问题的解决方案是我们添加了一个参数' layer_gtype = POINT'在创建索引时!