Teradata SQL PDCR 查询 - 过滤掉以仅获取具有高 CPU 排名的唯一查询(数据库性能调整)
Teradata SQL PDCR query- filtering out to get only Unique Queries with High CPU rank ( Database Performance tuning )
我正在 运行 将标准查询加入 PDCRLogtbl 与 PDCRSQLTbl 以提高影响力 CPU。我确信以前在大多数地方都使用过/见过类似的。没什么可说的
SELECT
RANK(ImpactCPU) AS CPURank
,USERNAME
,sessionid
,AcctString
,/*--including additionally */ Hashrow ( qrytext) Unique_SQL_ID
/* qrytext comes from SQLtbl.SQLTextinfo if available or its logtbl.querytext*/
<col list>
from
(SELECT a.USERNAME
, sessionid
-- , a.logdate
, a.ProcId
, a.QueryId
, a.expandacctstring
<calculations for CPU skew, Impact CPU , other skew's here>
from PDCRinfo.DBQLogtbl
where <filters here>
group by clause
) a
LOJ ( sel < col list> from FROM PDCRInfo.DBQLSQLTbl s
where <filters here> ) s on <join cols >
order by CPURank asc , spoolusage desc
o/p 是这样的
CPUrank Username <other cols> impactCPU Querytext Unique_SQL_ID
1 JohnD 50000 Sel foobar 1F-0C-A1-EB
5 JaneD 60000 sel yadaya A9-CE-55-1D
6 JohnD 35000 Sel foobar 1F-0C-A1-EB
9 JohnD 25000 Sel foobar 1F-0C-A1-EB
10 BobD 24000 sel Daddy 6E-1C-18-08
11 JaneD 23000 sel yadaya A9-CE-55-1D
12 JohnD 22500 Sel foobar 1F-0C-A1-EB
15 GeorgeD 22400 sel holahu 9B-4A-D1-F4
这里 SAME Unique_SQL_ID
出现在不同的位置 1 、 6 和 9.I 只想要第一个实例 - 一个 highest CPU rank
出现,其他人被忽略。毕竟,在不同的场合,相同的 SQL 被 运行 结束。
想要的
CPUrank Username <other cols> impactCPU Querytext Unique_SQL_ID
1 JohnD 50000 Sel foobar 1F-0C-A1-EB
5 JaneD 60000 sel yadaya A9-CE-55-1D
10 BobD 24000 sel Daddy 6E-1C-18-08
15 GeorgeD 22400 sel holahu 9B-4A-D1-F4
我应该做什么?可能会放入一个合格的或类似的过滤器......某种 OLAP 函数来传递这些行,然后将它们过滤掉。我想我可以通过 dt
额外传递所有这些行来做到这一点,但想看看是否有一个简单的过滤器我可以坚持在那里,它也可以完成这项工作
谢谢!
在查询末尾添加此筛选器,即可解决问题。
qualify
ROW_NUMBER() OVER (PARTITION BY Unique_SQL_ID
ORDER BY impactCPU DESC
)
= 1
原始答案优雅地给出了 row_num () over (PARTITION BY Unique_SQL_ID ORDER BY impactCPU DESC )
这正是我正在寻找的。但这是一个有序的分析函数——你不能把它放在 where
子句或 having
中。这只是一个小的修改。 MatBailie 给出的答案的要点是 abs。正确的 。谢谢垫
我正在 运行 将标准查询加入 PDCRLogtbl 与 PDCRSQLTbl 以提高影响力 CPU。我确信以前在大多数地方都使用过/见过类似的。没什么可说的
SELECT
RANK(ImpactCPU) AS CPURank
,USERNAME
,sessionid
,AcctString
,/*--including additionally */ Hashrow ( qrytext) Unique_SQL_ID
/* qrytext comes from SQLtbl.SQLTextinfo if available or its logtbl.querytext*/
<col list>
from
(SELECT a.USERNAME
, sessionid
-- , a.logdate
, a.ProcId
, a.QueryId
, a.expandacctstring
<calculations for CPU skew, Impact CPU , other skew's here>
from PDCRinfo.DBQLogtbl
where <filters here>
group by clause
) a
LOJ ( sel < col list> from FROM PDCRInfo.DBQLSQLTbl s
where <filters here> ) s on <join cols >
order by CPURank asc , spoolusage desc
o/p 是这样的
CPUrank Username <other cols> impactCPU Querytext Unique_SQL_ID
1 JohnD 50000 Sel foobar 1F-0C-A1-EB
5 JaneD 60000 sel yadaya A9-CE-55-1D
6 JohnD 35000 Sel foobar 1F-0C-A1-EB
9 JohnD 25000 Sel foobar 1F-0C-A1-EB
10 BobD 24000 sel Daddy 6E-1C-18-08
11 JaneD 23000 sel yadaya A9-CE-55-1D
12 JohnD 22500 Sel foobar 1F-0C-A1-EB
15 GeorgeD 22400 sel holahu 9B-4A-D1-F4
这里 SAME Unique_SQL_ID
出现在不同的位置 1 、 6 和 9.I 只想要第一个实例 - 一个 highest CPU rank
出现,其他人被忽略。毕竟,在不同的场合,相同的 SQL 被 运行 结束。
想要的
CPUrank Username <other cols> impactCPU Querytext Unique_SQL_ID
1 JohnD 50000 Sel foobar 1F-0C-A1-EB
5 JaneD 60000 sel yadaya A9-CE-55-1D
10 BobD 24000 sel Daddy 6E-1C-18-08
15 GeorgeD 22400 sel holahu 9B-4A-D1-F4
我应该做什么?可能会放入一个合格的或类似的过滤器......某种 OLAP 函数来传递这些行,然后将它们过滤掉。我想我可以通过 dt
额外传递所有这些行来做到这一点,但想看看是否有一个简单的过滤器我可以坚持在那里,它也可以完成这项工作
谢谢!
在查询末尾添加此筛选器,即可解决问题。
qualify
ROW_NUMBER() OVER (PARTITION BY Unique_SQL_ID
ORDER BY impactCPU DESC
)
= 1
原始答案优雅地给出了 row_num () over (PARTITION BY Unique_SQL_ID ORDER BY impactCPU DESC )
这正是我正在寻找的。但这是一个有序的分析函数——你不能把它放在 where
子句或 having
中。这只是一个小的修改。 MatBailie 给出的答案的要点是 abs。正确的 。谢谢垫