У меня есть запрос для вычисления расстояний от каждого узла до ближайшего места с использованием 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)) и запрос выполняется медленно.Для 10K мест и n
узлов я получаю
1 К узлов: 1 с
10 К узлов: 12 с
100 К узлов: 326 с
1 М узлов: 100000+ с
- Брут-форсирование узлов 10K * 10K-места требуют около 1000M операций с плавающей запятой и должны занимать менее секунды.Вместо этого требуется 12 сек.
- Сложность вычислений должна быть в худшем случае линейной.Почему это стоит O (n ^ (3/2))?
Есть ли способ ускорить выполнение этих вычислений в Oracle?