Oracle SQL вычисление ближайшей точки является медленным и нелинейным - PullRequest
0 голосов
/ 04 марта 2019

У меня есть запрос для вычисления расстояний от каждого узла до ближайшего места с использованием 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+ с

  1. Брут-форсирование узлов 10K * 10K-места требуют около 1000M операций с плавающей запятой и должны занимать менее секунды.Вместо этого требуется 12 сек.
  2. Сложность вычислений должна быть в худшем случае линейной.Почему это стоит O (n ^ (3/2))?

Есть ли способ ускорить выполнение этих вычислений в Oracle?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...