Пространственный запрос Oracle работает с одним экземпляром, а не с другим

У меня есть это заявление, созданное Geoserver

SELECT
shape AS shape
FROM
    (
        SELECT
            c.chantier_id      id,
            sdo_geom.sdo_buffer(c.shape, m.diminfo, 1) shape,
            c.datedebut        datedebut,
            c.datefin          datefin,
            o.nom              operation,
            c.brouillon        brouillon,
            e.code             etat,
            u.utilisateur_id   utilisateur,
            u.groupe_id        groupe
        FROM
            user_sdo_geom_metadata   m, lyv_chantier             c
            JOIN lyv_utilisateur          u ON c.createur_id = u.utilisateur_id
            JOIN lyv_etat                 e ON c.etat_id = e.etat_id
            JOIN lyv_operation            o ON c.operation = o.id
        WHERE
            m.table_name = 'LYV_CHANTIER'
            AND m.column_name = 'SHAPE'
    ) vtable
WHERE
    ( brouillon = 0
      AND ( etat != 'archive'
            OR etat IS NULL )
      AND sdo_filter(shape, mdsys.sdo_geometry(2003, 4326, NULL, mdsys.sdo_elem_info_array(1, 1003, 1), mdsys.sdo_ordinate_array(
      2.23365783691406, 48.665657043457, 2.23365783691406, 48.9341354370117, 2.76649475097656, 48.9341354370117, 2.76649475097656, 48.665657043457, 2.23365783691406, 48.665657043457)), 'mask=anyinteract querytype=WINDOW') = 'TRUE' );

В моем локальном экземпляре (докеризованном, если это может что-то объяснить) он работает нормально, но в другом экземпляре я получаю сообщение об ошибке:

ORA-13226: интерфейс не поддерживается без пространственного индекса

Я предполагаю, что SDO_FILTER применяется к результату SDO_BUFFER, который, следовательно, не индексируется.
Но почему он работает на моем локальном экземпляре?!
Может быть, есть какая-то странная махинация с конфигурацией, которая могла бы объяснить другое поведение? ?

РЕДАКТИРОВАТЬ: Идея заключается в том, чтобы обойти ошибку в Geoserver с базами данных Oracle, когда он отображает только первую точку геометрии MultiPoint, но отлично работает с MutltiPolygon. Я использую представление SQL в качестве слоя в Geoserver (отсюда, я думаю, и подзапрос).


person Morysh    schedule 06.05.2020    source источник
comment
Создан ли в таблице пространственный индекс? если это не так, попробуйте создать файл index. Есть много вопросов о том, как это сделать, например   -  person micklesh    schedule 06.05.2020
comment
Да, в обоих экземплярах есть пространственный индекс. И строка USER_SDO_GEOM_METADATA для этой таблицы тоже идентична   -  person Morysh    schedule 07.05.2020
comment
Вероятно, вы используете Oracle 12.2 или более позднюю версию в докеризованном экземпляре, а другой — более старую версию. Начиная с версии 12.2, пространственные индексы необязательны: пространственные операторы будут выполняться (хотя и медленнее), даже если индекса не существует. В 12.1 и более ранних версиях, если индекс не существует, вы получаете эту ошибку.   -  person Albert Godfrind    schedule 07.05.2020
comment
Да, в обоих экземплярах есть пространственный индекс. Но это индекс столбца SHAPE из таблицы LYV_CHANTIER. Проблема связана со столбцом, возвращаемым подзапросом. Это явно не индексируется, и старые версии Oracle будут жаловаться на это.   -  person Albert Godfrind    schedule 07.05.2020


Ответы (1)


Во-первых, вам нужно сделать некоторую отладку здесь. Подключитесь к каждому экземпляру от того же пользователя, что и источник данных вашего Geoserver, и запустите sql. Из тех же подключений (в каждом экземпляре) вы также должны убедиться, что в представлении метаданных пользователя (user_sdo_geom_metadata) есть запись для таблицы, а у таблицы есть пространственный индекс, владельцем которого является тот же пользователь, что и тот, с которым вы подключаетесь.
Кроме того, ваш запрос (выберите ... из «vtable») имеет столбец «форма», который является буфером столбца lyv_chantier.shape. sdo_filter в этом sql ожидает пространственный индекс в vtable.shape, который не может существовать. Вы должны попробовать использовать другой псевдоним (например, buf_shape) и sdo_filter(buf_shape,...) - чтобы убедиться, что sql не работает в обоих случаях, как и должно быть.

Сейчас я немного спешу, поэтому мои инструкции резюмированы. Если хотите, сделайте эту отладку и опубликуйте результаты. Затем мы можем перейти к деталям.

РЕДАКТИРОВАТЬ: Судя по вашим усилиям, я бы сказал, что самый простой подход: 1) добавить второй столбец геометрии в lyv_chantier (например, buf_shp). 2) обновить lyv_chantier установить buf_shp = sdo_geom.sdo_buffer(shape,...). 3) вставить в user_sdo_geom_metadata значения (lyv_chantier, buf_shp, ...). 4) создать пространственный индекс для столбца buf_shp. Возможно, вам придется использовать триггер для обновления buf_shp при каждом изменении формы...
Это очень практичный подход, но вы не предоставляете никакой информации о своем случае (какая версия оракула, сколько строк в таблице , как он используется, почему вы хотите использовать sdo_buffer и т. д.), так что это моя рекомендация на данный момент.
Кроме того, поскольку вы, скорее всего, используете представление sql в качестве слоя в Geoserver (вы не говорите что-нибудь об этом), вы также можете рассмотреть возможность использования чистой функциональности GS для достижения своей цели.
В конце концов, без описания вашей цели трудно предоставить что-то более индивидуальное.

person GregStef    schedule 07.05.2020
comment
Я запустил SQL из SQLDeveloper, он работает на локальном экземпляре. Как ни странно, событие с новым псевдонимом buf_shape все еще работает. Я предполагаю, что аномалия заключается в том, что он работает на моем локальном экземпляре... Я попытался использовать другую форму для SDO_BUFFER и создать индекс на основе функций, как описано здесь : CREATE INDEX sidx_lyv_chantier_buffer ON Lyv_chantier(sdo_geom.sdo_buffer(shape, 0.001, 1)) INDEXTYPE IS MDSYS.SPATIAL_INDEX; - person Morysh; 07.05.2020
comment
Что вызывает у меня следующую ошибку: ```CREATE INDEX sidx_lyv_chantier_buffer ON Lyv_chantier(sdo_geom.sdo_buffer(shape, 0.001, 1)) INDEXTYPE IS MDSYS.SPATIAL_INDEX Отчет об ошибке - ORA-29855: ошибка произошла при выполнении подпрограммы ODCIINDEXCREATE ORA-13203 : не удалось прочитать представление USER_SDO_GEOM_METADATA. ORA-13203: не удалось прочитать представление USER_SDO_GEOM_METADATA. - person Morysh; 07.05.2020
comment
Поэтому я попытался добавить запись в USER_SDO_GEOM_METADATA: INSERT INTO USER_SDO_GEOM_METADATA (table_name, column_name, srid, diminfo) VALUES ('LYV_CHANTIER', 'SDO_GEOM.SDO_BUFFER(SHAPE, 0.001, 1)', 4326, (SELECT diminfo FROM USER_SDO_GEOM_METADATA WHERE table_name='LYV_CHANTIER' AND column_name='CHANTIER_ID')) Error report - ORA-13199: wrong column name: SDO_GEOM.SDO_BUFFER(SHAPE, 0.001, 1) ORA-06512: at "MDSYS.MD", line 1723 ORA-06512: at "MDSYS.MDERR", line 17 ORA-06512: at "MDSYS.SDO_GEOM_TRIG_INS1", line 20 ORA-04088: error during execution of trigger 'MDSYS.SDO_GEOM_TRIG_INS1' - person Morysh; 07.05.2020
comment
Были некоторые опечатки/синтаксические ошибки, мне удалось заставить вставку в USER_SDO_GEOM_METADATA работать так: INSERT INTO USER_SDO_GEOM_METADATA (table_name, column_name, srid, diminfo) VALUES ('LYV_CHANTIER', 'SDO_GEOM.SDO_BUFFER(SHAPE,0.001,1)', 4326, (SELECT diminfo FROM USER_SDO_GEOM_METADATA WHERE table_name='LYV_CHANTIER' AND column_name='SHAPE')); - person Morysh; 07.05.2020
comment
Однако создание индекса по-прежнему выдает ошибку: CREATE INDEX sidx_lyv_chantier_buffer ON Lyv_chantier(SDO_GEOM.SDO_BUFFER(SHAPE,0.001,1)) INDEXTYPE IS MDSYS.SPATIAL_INDEX Error report - ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine ORA-13203: failed to read USER_SDO_GEOM_METADATA view ORA-13203: failed to read USER_SDO_GEOM_METADATA view ORA-06512: at "MDSYS.SDO_INDEX_METHOD_10I", line 10 29855. 00000 - "error occurred in the execution of ODCIINDEXCREATE routine" *Cause: Failed to successfully execute the ODCIIndexCreate routine. - person Morysh; 07.05.2020
comment
USER_SDO_GEOM_METADATA ожидает имя столбца, а не sdo_geom.function. Смотрите редактирование в моем исходном ответе. - person GregStef; 07.05.2020
comment
Я создал новый столбец с триггером, в котором хранится буферизованная геометрия, если это MultiPoint, а если нет, то базовая геометрия. Я добавил запись USER_SDO_GEOM_METADATA для этого нового столбца, а также пространственный индекс, и он отлично работает. - person Morysh; 12.05.2020
comment
Я рад, что у тебя все получилось. Однако я чувствую необходимость указать, что я никогда не сталкивался с такой ошибкой GS, и я боюсь, что ваше решение может быть неправильным. При этом, если это работает так, как вы хотите, оставьте его. - person GregStef; 13.05.2020
comment
Единственный источник, который мне удалось найти, это эта ветка с конца 2016 года, так что я предположил, что проблема все еще не решена, потому что почти ни у кого нет такой же странной настройки - person Morysh; 13.05.2020