Teradata SQL 调整:以下代码的目的是什么
Teradata SQL Tuning : What was the purpose of the below code
几年前,我调整了一个由 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 & obj tables 的查询,它们具有相同的 PI,然后在 dbc.child table 上执行 exists 并且它运行得非常好 - 相同 o/p。
但我认为我很幸运,因为 FINDB 没有任何子视图数据库。
我的问题 :
我试图了解的目的是什么
MIN(对象数据库名称)
我们的大多数 table 数据库名称都在视图数据库名称之前(格式为 findb_vw 等),所以我认为他可能试图消除视图数据库?
另一件事:为什么是 LOJ(我改为 IJ),因为您需要 Objectdatabasename 的值。我认为 LOJ 在这里不适用
我不太确定所以把问题抛到台上。所以只是为了澄清 - 我不是在寻找调整技巧。我想要 MIN (Objectdatabasename) 代码的其他观点。
你说得对,Left Join 没用(但优化器无论如何都会将其更改为 Inner Join,所以它只是令人困惑)。
MIN (objectdatabasename)
可能用于避免同一 queryid 的多行导致重复行(并且可能删除视图数据库)。
但恕我直言,性能不佳的主要原因是 DBQL 表之间缺少连接条件。 pdcrinfo
中的表应该按 LogDate
分区,您需要将 AND a.LogDate=b.LogDate
添加到现有的 ON a.queryid=b.queryid
以获得快速连接(PI + 分区),否则优化器必须做一些准备或更昂贵的 滑动 window 加入 .
几年前,我调整了一个由 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 & obj tables 的查询,它们具有相同的 PI,然后在 dbc.child table 上执行 exists 并且它运行得非常好 - 相同 o/p。 但我认为我很幸运,因为 FINDB 没有任何子视图数据库。 我的问题 : 我试图了解的目的是什么 MIN(对象数据库名称) 我们的大多数 table 数据库名称都在视图数据库名称之前(格式为 findb_vw 等),所以我认为他可能试图消除视图数据库? 另一件事:为什么是 LOJ(我改为 IJ),因为您需要 Objectdatabasename 的值。我认为 LOJ 在这里不适用
我不太确定所以把问题抛到台上。所以只是为了澄清 - 我不是在寻找调整技巧。我想要 MIN (Objectdatabasename) 代码的其他观点。
你说得对,Left Join 没用(但优化器无论如何都会将其更改为 Inner Join,所以它只是令人困惑)。
MIN (objectdatabasename)
可能用于避免同一 queryid 的多行导致重复行(并且可能删除视图数据库)。
但恕我直言,性能不佳的主要原因是 DBQL 表之间缺少连接条件。 pdcrinfo
中的表应该按 LogDate
分区,您需要将 AND a.LogDate=b.LogDate
添加到现有的 ON a.queryid=b.queryid
以获得快速连接(PI + 分区),否则优化器必须做一些准备或更昂贵的 滑动 window 加入 .