暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ANSI SQL比Oracle SQL表示法慢

ASKTOM 2020-09-22
251

问题描述

您好,我注意到有时使用ANSI SQL编写的Insert语句的查询运行速度比使用Oracle本机语法构造的查询慢。但是最近我有一个案例,即本机SQL在几秒钟内执行,而ANSI SQL无法完成。
我通过将ANSI SQL转换为Oracle native来解决该问题,但想了解为什么会发生这种情况,以及是否可以提供有关何时不使用ANSI SQL的指导方针。

长时间运行的查询是从一个巨大的事实表和几个不太大的维度表中提取数据。
事实表按日期范围划分,按列表划分,并使用PARALLEL 16子句创建。
查询中的/* FULL */ hint用于强制执行Exadata智能扫描。查询看起来像这样:

SELECT /*+ FULL (fact) */
  fact.partition_key_date,
  fact.subpartition_col,
  SUM(CASE WHEN fact.col = 'S' THEN (ABS (sale_amt)) END)
      OVER PARTITION (fact.col_a, fact.col_b) as SALE_AMT,
  SUM(CASE WHEN fact.col = 'O' THEN (sale_amt) END)
      OVER PARTITION (fact.col_a, fact.col_b) as OTHER_AMT
FROM dim1
     JOIN fact
        ON dim1.key = fact.attr1
     JOIN dim2
        ON fact.attr2 = dim2.key
          AND dim2.col = 'ABC'
WHERE fact.partition_key_date = :dt_parm
  AND fact.subpartition_col = 'KYZ'
  AND fact.attr2 = 'X'
  AND NVL(fact.attr3, 'N') <> 'Y'
  AND NOT EXISTS (
                 SELECT 1
                 FROM dim3
                 WHERE fact.attr4 = dim3.key);


在启动32个并行从属服务器之前,它已排队等待并行执行一个多小时。它运行了许多小时,但从未完成。
但是,当从选定列列表中删除分析和函数时,它会在几秒钟内完成。
然而,使用相同的分析功能和Oracle SQL语法,如下所示,查询也在5秒内完成。

SELECT /*+ FULL (fact) */
  fact.partition_key_date,
  fact.subpartition_col,
  SUM(CASE WHEN fact.col = 'S' THEN (ABS (sale_amt)) END)
      OVER PARTITION (fact.col_a, fact.col_b) as SALE_AMT,
  SUM(CASE WHEN fact.col = 'O' THEN (sale_amt) END)
      OVER PARTITION (fact.col_a, fact.col_b) as OTHER_AMT
FROM dim1,
     fact,
     dim2
WHERE fact.partition_key_date = :dt_parm
  AND fact.subpartition_col = 'KYZ'
  AND fact.attr2 = 'X'
  AND NVL(fact.attr3, 'N') <> 'Y'
  AND dim1.key = fact.attr1
  AND fact.attr2 = dim2.key
  AND dim2.col = 'ABC'
  AND NOT EXISTS (
                 SELECT 1
                 FROM dim3
                 WHERE fact.attr4 = dim3.key);



专家解答

ANSI联接查询被重写为使用Oracle语法,但是转换可能会导致执行计划差异。

但是... 我们认为这是一个错误,因为我们从不希望有任何区别,因此请将其报告给支持人员。我们建议您做什么:

对于每个查询,请执行

-启动新的数据库会话
-alter session set events = '永远10053跟踪名称上下文,级别1'
-解释 [您的查询] 的计划

这将创建2个跟踪文件,您可以提供支持。

支持将是您在这里的第一个呼叫端口,但是如果您愿意,可以通过电子邮件将两个跟踪文件发送到 “asktom_us@oracle.com”,我们也会看看。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论