我有一个查询,使用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+秒
是否有一种方法可以使此计算在Oracle中更快地运行?