Oracle SQL最近点计算缓慢且非线性

时间:2019-03-04 16:36:44

标签: sql oracle geolocation query-optimization oracle-spatial

我有一个查询,使用Oracle Spartial计算每个节点到最近位置的距离。

select n.nodeid as n_node_id, n.geoloc.sdo_point.y as node_y, n.geoloc.sdo_point.x as node_x,
p.id as place_i, p.geoloc.sdo_point.y as sl_y, p.geoloc.sdo_point.x as sl_x,
sdo_nn_distance(1)  as straight_line_distance
from  mynode n,    myplace p
where
sdo_nn (p.GEOLOC, n.geoloc, 'Unit = MILE sdo_num_res = 1', 1) = 'TRUE'

索引是使用此查询创建的

  -- Create spartial index
  INSERT INTO user_sdo_geom_metadata
          VALUES ('mynode ', 'GEOLOC',
                  MDSYS.SDO_DIM_ARRAY(
                    MDSYS.SDO_DIM_ELEMENT('X', -180, 180, 0.0000005),
                    MDSYS.SDO_DIM_ELEMENT('Y', -90, 90, 0.0000005)),  8307 );
  --Wait for query to complete and run       
    CREATE INDEX mynode_IX ON mynode (GEOLOC)
            INDEXTYPE IS MDSYS.SPATIAL_INDEX
            PARAMETERS ('SDO_INDX_DIMS=2')

实际执行时间似乎为O(n * sqrt(n)),查询运行缓慢。对于1万个地方和n个节点,我得到

1 K个节点:1秒
10 K节点:12秒
100K节点:326秒
1 M节点:100000+秒

  1. 强行强制1万个节点* 1万个位置需要大约1000M浮点运算,并且需要不到一秒钟的时间。而是需要12秒。
  2. 计算复杂度应该是最坏的线性关系。为什么要花O(n ^(3/2))?

是否有一种方法可以使此计算在Oracle中更快地运行?

0 个答案:

没有答案