这是Microsoft还是Oracle问题?

时间:2019-05-05 01:38:14

标签: oracle odbc office365 dsn

在我的原始线程中,How can I fix ORA: 01013 (user requested cancel...) when trying to link Oracle tables in MS Access?描述了一个尝试将Oracle表链接到Microsoft Access(办公室365)数据库的问题。输入UID和密码后,该过程超时。

在研究问题时,我能够确定ODBC驱动程序和DSN可用于ADO,Toad和Microsoft Power BI(当针对Oracle表使用特定查询时)。我再也无法通过Access或Excel在Oracle V $ SQL表中记录条目,以进一步解决问题。

但是,今晚,我能够通过尝试通过DSN连接并浏览Oracle中的表来使Power BI重新创建相同的行为。 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分钟。我认为这是因为即使查询正在运行,该对象也在不断更新。

Oracle认证的MS ODBC规范的细节让我头疼,所以我不知道是否继续向Microsoft购买票证,还是将注意力转移到Oracle作为此问题的罪魁祸首。 / p>

任何人和所有建议都表示赞赏。我真的需要知道哪一方负责上述SQL。

谢谢!

2 个答案:

答案 0 :(得分:1)

这看起来像一个Oracle问题。尽管该错误是ODBC超时设置的直接结果,但该查询应该不需要20分钟即可完成运行。

遇到数据字典性能问题时要尝试的第一件事是收集有关数据字典的统计信息。这为Oracle提供了有关对象大小的更多信息,因此可以对如何联接表做出更好的决定。

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

如果这不起作用,则需要将查询缩小到可能仍然有问题的最小大小。 UNION ALL共包含三个查询,可能只有其中一个很慢。然后,我们可以优化该查询。

(但是调优查询是一个反复的过程,并且很难在Internet上完成。您可能希望尝试寻找可以提供帮助的本地数据库管理员。使用Express Edition,您无法联系Oracle支持以寻求帮助。)

答案 1 :(得分:1)

如果能够从Power BI更改SQL调用,则会发现以下查询产生相同的输出。它在与Power BI一起安装了Oracle的笔记本电脑上运行不到一秒钟。相比之下,原始查询需要近30分钟的时间。 Microsoft,您可能想看看您的产品如何通过DSN连接到较新的Oracle产品:

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