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

时间:2016-01-11 18:21:48

标签: sql teradata database-performance query-performance sqlperformance

我调整了几年前由Teradata Co.顾问撰写的严重偏差的查询。相同的代码是一个永久性的高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;

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

我不确定这样在舞台上打开这个问题。所以只是为了澄清 - 我不是在寻找调优技巧。我想要MIN(Objectdatabasename)代码的其他观点。

1 个答案:

答案 0 :(得分:2)

你是对的,左连接是没用的(但优化器无论如何都会把它改成内连接,所以它只是让人困惑)。

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

但是恕我直言,性能不佳的主要原因是DBQL表之间缺少连接条件。 pdcrinfo中的表格应由LogDate分区,您需要将AND a.LogDate=b.LogDate添加到现有ON a.queryid=b.queryid以获得快速加入(PI +分区),否则优化程序必须做某种准备或更昂贵的滑动窗口加入