Пространственный индекс Oracle в представлении нескольких таблиц - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть три большие таблицы с одинаковой структурой (BATHY_SHC_1, BATHY_SHC_2 and BATHY_SHC_3), каждая с столбцом SDO_GEOMETRY POINT_PP, пространственный индекс каждой из которых VALID.Я сделал вид на эти таблицы, который включает этот столбец геометрии (V_BATHY_SHC).Я могу сделать пространственный запрос на представление, чтобы найти все точки в прямоугольнике, как это с правильными результатами:

SELECT PT_ID, POINT_PP from V_BATHY_SHC
WHERE SDO_RELATE(POINT_PP, MDSYS.SDO_GEOMETRY(2003, 32618, null, MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),MDSYS.SDO_ORDINATE_ARRAY(635267,5037808, 635277,5037818)), 'mask=anyinteract') = 'TRUE';

Я загрузил многоугольник MASK в таблицу MNE_MASK, добавил строку в метаданныхи создал пространственный индекс (как обычно).Имеет действительный пространственный индекс.Геометрия находится в том же SRID (32618).Затем я хочу получить все точки вида, которые находятся внутри многоугольника из таблицы MNE_MASK.Если я сделал запрос по одной из таблиц, я получу правильные результаты:

SELECT A.PT_ID, A.POINT_PP
FROM BATHY_SHC_1 A, MNE_MASK B
WHERE B.MNE_ID = 1
AND SDO_RELATE(A.POINT_PP, B.MASK, 'mask=ANYINTERACT ') = 'TRUE';

Но если я сделал это в представлении, подобном этому:

SELECT A.PT_ID, A.POINT_PP
FROM V_BATHY_SHC A, MNE_MASK B
WHERE B.MNE_ID = 1
AND SDO_RELATE(A.POINT_PP, B.MASK, 'mask=ANYINTERACT ') = 'TRUE';

Я получил эту ошибку:

ORA-13226: интерфейс не поддерживается без пространственного индекса ORA-06512: в «MDSYS.MD», строка 1723 ORA-06512: в «MDSYS.MDERR», строка 8 ORA-06512:в "MDSYS.SDO_3GL", строка 94

В прошлом я всегда без проблем выполнял запросы по пространственному индексу представлений нескольких таблиц.
Я могу сделать пространственный запрос по обеим безпроблема, но я не могу сделать SDO_RELATE между ними ... Почему этот отличается?Большое спасибо за ваше понимание и помощь!

Редактировать: я нашел быстрый обходной путь, но он не объясняет почему.Если я поменяю два первых параметра в функции SDO_RELATE, запрос сработает.

SELECT A.PT_ID, A.POINT_PP
FROM V_BATHY_SHC A, MNE_MASK B
WHERE B.MNE_ID = 1
AND SDO_RELATE(B.MASK, A.POINT_PP, 'mask=ANYINTERACT ') = 'TRUE';

1 Ответ

0 голосов
/ 09 декабря 2018

В SDO_RELATE первый параметр - это столбец геометрии в таблице, тогда как второй - это отдельная геометрия.При этом интересно, почему ваш оригинальный запрос работает.Там у вас есть столбец представления в качестве первого параметра, как и в случае неудачного запроса.

...