【问题标题】:Teradata SQL Tuning : What was the purpose of the below codeTeradata SQL 调优:以下代码的目的是什么
【发布时间】:2016-04-16 03:59:16
【问题描述】:

我调整了几年前由 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;

我已经重写了查询加入具有相同 PI 的 log 和 obj 表,然后在 dbc.child 表上执行 exists,它运行得非常好 - 相同的 o/p。 但我认为我很幸运只是因为 FINDB 没有任何子视图数据库。 我的问题 : 我试图了解的目的是什么 MIN(对象数据库名称) 我们的大多数表数据库名称都在视图数据库名称之前(格式为 findb_vw 等),所以我认为他可能试图消除视图数据库? 另一件事:为什么要使用 LOJ(我改为 IJ),因为您需要 Objectdatabasename 的值。我认为 LOJ 不适用于这里

我不确定是否会在舞台上提出问题。所以只是为了澄清 - 我不是在寻找调整技巧。我想要 MIN (Objectdatabasename) 代码的其他观点。

【问题讨论】:

  • 这应该是如何格式化您的代码的示例。我看不懂,能不能花点时间改进一下?

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


【解决方案1】:

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

MIN (objectdatabasename) 可能用于避免同一查询 ID 的多行导致重复行(并且可能用于删除视图数据库)。

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

【讨论】:

  • 嗨 Dieter 是的,就像我说的 Obj 和 Log Tb 具有相同的 PI,所以为什么要创建 DT 并且我在查询中包含 logdate,就像你说的那样 - 这被遗漏了。但实际上最昂贵的一步是加入 DBC。表。我必须在视点上运行时钟以获取确切的步长级别指标(不,我们没有打开步长记录)但这是我记下的解释中的摘要`PDCRDATA.DBQLOBJTBL_HST = 42132 & 42130(内置在第二个的所有 AMPS 上); DBC.DBASE 42137 42137 +42130=42138 最后一步成本高昂,需要 1.x 小时才能运行。
  • @user1874594:您的查询中没有连接到 dbc.tables?
  • JOIN dbc.children c ON b.objectdatabasename=c.child
  • 对不起,我的意思是 DBC 表是简单的英语。我并没有打算将带有 DBC 的表限定为 db。
  • 令我感兴趣的另一件事是行差异。我有 2 种上述 Q 的形式运行良好,但第 1 种形式比第 2 种形式多 3 行。第 2 种形式给出与原始 Q 完全相同的 o/p。但我无法完全理解为什么会有差距。这是第一种形式,多 3 行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多