Teradata SQL调优:下面代码的目的是什么



我调整了一个查询,该查询几年前由Teradata公司的一位顾问编写,严重失真。同样的代码是一个永远高CPU的报告,它已经变得更糟

    SELECT 
    c.child  ,
    a.username ,
    CAST( SUM((((a.AmpCPUTime(DEC(18,3)))+
         ZEROIFNULL(a.ParserCPUTime)) )) AS DECIMAL(18,3)) 
   FROM pdcrinfo.dbqlogtbl a
          LEFT OUTER JOIN (
    SELECT queryid,logdate,
        MIN (objectdatabasename) AS                  objectdatabasename
        FROM pdcrinfo.dbqlobjtbl_hst
        GROUP BY 1,2 ) b                  ON a.queryid=b.queryid 
          JOIN dbc.children c   ON b.objectdatabasename=c.child
    WHERE c.parent ='FINDB'
AND  a.logdate BETWEEN                    '2015-12-01'  AND '2015-12-31'
        and    b.logdate BETWEEN                   '2015-12-01'  AND '2015-12-31'
    GROUP BY 1,
        2,
        3
    ORDER BY 1,
        2,
        3;

我已经重写了查询加入日志&具有相同PI然后执行的obj表存在于dbc.child表上,并且它运行得非常好-相同的o/p。但我觉得我很幸运,因为FINDB没有任何作为视图数据库的孩子。我的问题:我正在努力理解MIN(对象数据库名称)我们的大多数表数据库名称都在视图数据库名称之前(其形式为findb_vw等),所以我认为他可能试图消除视图数据库?另一件事:为什么是LOJ(我改成了IJ),因为你想要一个Objectdatabasename的值。我认为LOJ不适用于这里

我不确定是不是把这个问题放在舞台上。所以我只是想澄清一下——我不是在寻找调整技巧。我想要MIN(Objectdatabasename)代码的其他透视图。

没错,Left Join是无用的(但优化器无论如何都会将其更改为内部Join,所以这只是令人困惑)。

MIN (objectdatabasename)可能用于避免同一queryid的多行导致重复行(也可能用于删除视图dbs)。

但是IMHO性能差的主要原因是缺少DBQL表之间的联接条件。pdcrinfo中的表应该由LogDate进行分区,您需要将AND a.LogDate=b.LogDate添加到现有的ON a.queryid=b.queryid中以获得快速联接(PI+分区),否则优化器必须进行某种准备或更昂贵的滑动窗口联接

最新更新