【发布时间】: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