【发布时间】:2016-11-16 02:57:24
【问题描述】:
我正在从以下查询(查询 1)计算两个 2 点之间的距离(使用它们的 gps 坐标)。我的表的一列存储 point1 的 geo_location ,并且 point2 的位置动态提供到绑定变量中。查询工作正常,并为我提供了 point1 和 point2 之间的确切距离。但是,每当执行此查询时,我都会看到数据库服务器上的 CPU 利用率很高(有时从 60% 到 95%)。当我尝试扫描 AWR 报告时,我发现有另一个查询(下面的查询 2)在内部触发,并且该查询扫描表中的每一行(对于 Query1 的每次执行),而与 where 子句无关(我正在寻找对于仅具有必须计算距离的特定文本的行)! 我尝试将文本搜索作为子查询 (Query3) 提供,因此此 sdo_nn 仅在此子集上运行但徒劳无功。如果表中有 15k 条记录,如果 Query 1 执行了 2k 次,那么 AWR Query 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;
【问题讨论】:
-
我们碰巧解决了ROWID上的具体问题,在创建索引时添加了layer_gtype参数!