Вам необходимо определить пространственный индекс в столбце position
. Для этого вам нужно сначала определить необходимые пространственные метаданные. Как это:
insert into user_sdo_geom_metadata (table_name, column_name, dim info, srid)
values (
'visitors',
'position',
sdo_dim_array (
sdo_dim_element ('x',-1000,1000,0.05),
sdo_dim_element ('y',-1000,1000,0.05)
),
null
);
commit;
Затем вы можете создать пространственный индекс:
create index visitors_sx on visitors(position)
indextype is mdsys.spatial_index;
Тогда ваш запрос будет завершен.
ПРИМЕЧАНИЯ
(1) Выше предполагается, что ваши пространственные данные (позиции) находятся в абстрактных декартовых координатах (то есть не содержат никакого явного идентификатора системы координат: SDO_SRID
равен NULL
). Это также относится и к окну вашего запроса. Однако в реальных приложениях вы должны всегда использовать явные системы координат, т.е. всегда заполнять SDO_SRID
. Это особенно важно, если ваши координаты геодезические (то есть долгота / широта). Сопоставление с ними в декартовой системе вернет неверные результаты. Кроме того, отсутствие явных идентификаторов SRID означает, что вы не сможете выполнять какие-либо измерения или сопоставлять данные с данными в других системах координат.
(2) Начиная с Oracle 12.2, пространственные индексы являются необязательными. Поскольку вы получаете сообщение об ошибке, я предполагаю, что вы используете старую (возможно, устаревшую) версию базы данных Oracle. Последний выпуск - Oracle 19c. Однако для реальных приложений вы должны всегда иметь пространственный индекс - за исключением случаев, когда ваши данные действительно крошечные: например, всего несколько объектов. Любой объект из 200 и более объектов будет нуждаться в пространственном индексе, чтобы получить правильный уровень производительности.