【DBQLからCPU使用率をみる】

◆ 私の職場の環境は以下のとおりです
  • Teradata 13.10

◆ DBQLogTblのみかたです
カラム 意訳 単位
QueryID クエリごとに発番された内部的なID。system-wideで一意だからほかのテーブルとも(QueryIDだけをキーにして)結合できるよ、とのこと
StartTime クエリがsubmitされたとき TimeStamp
FirstStepTime クエリが最初にdispatchされたとき TimeStamp
FirstRespTime最初のresponseが返されたとき TimeStamp
AMPCPUTime AMPが使用したCPUの時間
ParserCPUTimeparserとdispatcherが使用したCPUの時間
QueryText SQLの最初の200文字 (全文はDBQLSQLTblに残ってる)

[以下の2つの時間が計算できます]
経過時間:ElapsedTime = FirstRespTime - StartTime
実行時間:ExecuteTime = FirstRespTime - FirstStepTime (経過時間から待ち時間を除外)

[こっちも計算できます]

CPU使用時間:TotalCPUTime = AMPCPUTime + ParserCPUTime

SQLにするとこんな感じです
select ( FirstRespTime - StartTime       HOUR(4) TO SECOND(2) ) as ElapsedTime,  
          ( FirstRespTime - FirstStepTime HOUR(4) TO SECOND(2) ) as ExecuteTime, 
          ( AMPCPUTime + ParserCPUTime ) as TotalCPUTime
from DBC.DBQLogTbl
where ~


◆ ResUsageScpu
のみかたです
カラム 意訳 単位
TheDate ログがentryされた日付
TheTime ログがentryされた時刻
NodeID nodeのID
cpuidnodeごとのCPUのID
NominalSecs ロギングする間隔
CPUIdleidleの時間㌢秒
CPUIoWaitidleおよびI/O待ち時間㌢秒
CPUUServ userのservice codeをexecuteしている時間㌢秒
CPUUExec userのexecution codeをexecuteしている時間 ㌢秒

[以下の2つの時間が計算できます]
退屈な時間:IdleTime = CPUIdle + CPUIoWait
忙しい時間:BusyTime = CPUUServ + CPUUExec

[つまりはこういうことのようです]

CPU使用率:CPUUsage = ( CPUUServ + CPUUExec ) / ( CPUIdle + CPUIoWait + CPUUServ + CPUUExec ) * 100

※分母は理論的にはTotalCPUTimeになるはずですが、微妙に誤差はでるようです
 TotalCPUTimeは以下でも計算できます

1秒あたりのTotalCPUTimeはつまるところCPU(コア?)の数なので、
select count ( * ) as TotalCPUTimePerSec from
( select NodeID, cpuid  
  from DBC.ResUsageScpu
  group by NodeID, cpuid )

それにNominalSecs(何秒ごとにロギングしてるか)と100(㌢秒換算)をかけてさしあげます
理論的な分母:TotalCPUTime = TotalCPUTimePerSec * NominalSecs * 100


[特定のクエリがどれだけのCPUを占有しているかを平準化した率は、]

1秒間あたりのそのクエリのCPU時間をだして、
( DBQLogTbl.AMPCPUTime + 
DBQLogTbl.ParserCPUTime ) / DBQLogTbl.ExecuteTime ・・・(A)

1秒間あたりのTotalCPUTimeをだして(単位は秒のまま)、
ResUsageScpu.TotalCPUTimePerSec・・・(B)

(A) / (B) * 100 で割ることのすれば出せそうです


参考にしたリンクです
Main Log Table: DBQLogTbl
Calculating the actual query run time
ResUsageScpu Table - Summary Mode