Это проблема Microsoft или Oracle? - PullRequest
2 голосов
/ 05 мая 2019

В моей исходной ветке здесь: Как я могу исправить ORA: 01013 (пользователь запросил отмену ...) при попытке связать таблицы Oracle в MS Access? Я описываю проблему, пытаясь связать таблицы Oracle сбаза данных Microsoft Access (офис 365).Тайм-аут процесса после ввода UID и пароля.

Когда я исследовал проблему, я смог определить, что драйверы ODBC и DSN работают для ADO, Toad и Microsoft Power BI (при использовании определенногозапрос к таблице Oracle).Мне никогда не удавалось регистрировать записи в таблице Oracle V $ SQL из Access или Excel для дальнейшего устранения проблемы.

Однако сегодня вечером я смог заставить Power BI воссоздать такое же поведение, пытаясьподключиться через DSN и просмотреть таблицы в Oracle.Oracle перехватил вызов SQL, и в результате получился следующий гем:

SELECT
    *
FROM
    (
        SELECT
            NULL table_qualifier,
            o1.owner         table_owner,
            o1.object_name   table_name,
            DECODE(o1.owner, 'SYS', DECODE(o1.object_type, 'TABLE', 'SYSTEM TABLE', 'VIEW', 'SYSTEM VIEW', o1.object_type), 'SYSTEM'
            , DECODE(o1.object_type, 'TABLE', 'SYSTEM TABLE', 'VIEW', 'SYSTEM VIEW', o1.object_type), o1.object_type) table_type,
            NULL remarks
        FROM
            all_objects o1
        WHERE
            o1.object_type IN ('TABLE',
                'VIEW'
            )
        UNION
        SELECT
            NULL table_qualifier,
            s.owner          table_owner,
            s.synonym_name   table_name,
            'SYNONYM' table_type, null remarks
        FROM
            all_objects    o3,
            all_synonyms   s
        WHERE
            o3.object_type IN (
                'TABLE',
                'VIEW'
            )
            AND s.table_owner = o3.owner
            AND s.table_name = o3.object_name
        UNION
        SELECT
            NULL table_qualifier,
            s1.owner          table_owner,
            s1.synonym_name   table_name,
            'SYNONYM' table_type,
            NULL remarks
        FROM
            all_synonyms s1
        WHERE
            s1.db_link IS NOT NULL
    ) tables
WHERE
    1 = 1
    AND ( table_type = 'TABLE'
          OR table_type = 'VIEW' )
ORDER BY
    4,
    2,
    3

Я не знаю, с чего начать с этого запроса.Второй и третий подзапросы в выражении union отфильтровываются последним предложением where, поэтому они бесполезны.Первый подзапрос пытается получить список таблиц / схем из all_objects.Если я ограничу этот кусок SQL первыми 100 000 строк и запуском его в SQLPLUS, в Oracle 18c (XE) время выполнения будет более 20 минут.Я предполагаю, что это потому, что этот объект постоянно обновляется, даже когда выполняется запрос.

Подробная информация о спецификации MS ODBC, которую сертифицирует Oracle, находится у меня над головой, поэтому я не знаю, продолжать липоискать билеты в Microsoft или обратить мое внимание на Oracle как на виновника проблемы.

Любой и все советы приветствуются.Мне действительно нужно знать, какая сторона отвечает за SQL выше.

Спасибо!

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Если бы мне удалось изменить вызов SQL из Power BI, я обнаружил, что следующий запрос дает идентичный вывод. Он работает менее чем за одну секунду на ноутбуке, где установлен Oracle вместе с Power BI. Это контрастирует почти с 30 минутами для исходного запроса. Microsoft, вы можете посмотреть, как ваши продукты подключаются к новым продуктам Oracle через DSN:

SELECT
    *
FROM
    (
        SELECT
            NULL table_qualifier,
            o1.owner         table_owner,
            o1.object_name   table_name,
            o1.object_type table_type,
            NULL remarks
        FROM
            all_objects o1
        WHERE
            o1.object_type = 'TABLE' and
            o1.owner not in ('SYS','SYSTEM')
        UNION
        SELECT
            NULL table_qualifier,
            o1.owner         table_owner,
            o1.object_name   table_name,
            o1.object_type table_type,
            NULL remarks
        FROM
            all_objects o1
        WHERE
            o1.object_type = 'VIEW' and
            o1.owner not in ('SYS','SYSTEM')
    ) tables
ORDER BY
    4,
    2,
    3
1 голос
/ 05 мая 2019

Это похоже на проблему Oracle. Хотя ошибка является прямым следствием настроек тайм-аута ODBC, выполнение этого запроса не должно занять 20 минут.

Первое, что нужно попробовать, столкнувшись с проблемой производительности словаря данных, - это собрать статистику по словарю данных. Это дает Oracle больше информации о размерах объектов, поэтому она может принимать лучшие решения о том, как объединять таблицы.

begin
    dbms_stats.gather_fixed_objects_stats;
    dbms_stats.gather_dictionary_stats;
end;
/

Если это не сработает, вы захотите сократить запрос до наименьшего возможного размера, который все еще имеет проблему. Есть три запроса UNION ALL вместе, скорее всего только один из них медленный. Тогда мы сможем оптимизировать этот запрос.

(Но настройка запроса - это процесс, который требует много времени, и его трудно выполнить через Интернет. Возможно, вы захотите найти местного администратора базы данных, который может помочь. используя Express Edition, вы не можете обратиться за помощью в службу поддержки Oracle.)

...