【发布时间】:2017-09-28 03:05:35
【问题描述】:
我想获取每个数据库的 Space-Usage 以及所有子、孙的总和...
在 Teradata 中,数据库按照数据库及其直接所有者按层次结构进行组织。 每个数据库都有其 MaxPerm(=允许的空间使用)和 CurrentPerm(=实际使用的空间)
到目前为止,我有以下内容:
分两步做,先把层次拉平,然后用rollup总结一下
create volatile table dbHierarchy as
(
WITH RECURSIVE dbs AS
(
SELECT
cast(databasename AS VARCHAR(500)) AS L0
, cast('' AS VARCHAR(500)) AS L1
, cast('' AS VARCHAR(500)) AS L2
--, cast(null AS VARCHAR(500)) AS L3
, ownername
, databasename
, 0 AS depth
--, CAST(DatabaseName AS VARCHAR(500)) AS pretty_hierarchy
FROM DBC.databasesv
WHERE DatabaseName = 'DBC'
UNION ALL
SELECT
L0
, case when dbs.depth = 0 then dbsv.DatabaseName else dbs.L1 end as L1
, case when dbs.depth = 1 then dbsv.DatabaseName else dbs.L2 end as L2
--,case when dbs.depth = 2 then dbsv.DatabaseName else dbs.L3 end as L3
, dbsv.ownername
, dbsv.databasename
, depth + 1 AS depth
--, pretty_hierarchy || substring(' ' FROM 1 FOR (dbs.depth + 1)*3) ||'>'|| dbsv.DatabaseName as pretty_hierarchy
FROM dbs
INNER JOIN "DBC".DatabasesV dbsv
ON dbsv.OwnerName = dbs.databasename
AND dbsv.DatabaseName <> dbs.databasename
WHERE dbs.depth <=10
)
SELECT * FROM dbs
) WITH DATA
PRIMARY INDEX (databasename)
ON COMMIT PRESERVE ROWS;
select
coalesce(L0,'sum') as L0
, coalesce(L1,'sum') as L1
, coalesce(L2,'sum') as L2
--, coalesce(L3,'sum') as L3
,SUM(Space.MaxPerm)/(1024*1024)(bigint) as Max_Perm
,SUM(Space.CurrentPerm)/(1024*1024) (bigint) as Current_Perm
from DBC.DiskSpace Space
inner join dbHierarchy Hir
on Space.databasename = Hir.databasename
group by rollup (L0,L1,L2) --(L0, L1,L2,L3)
order by L0, L1, L2 --, L3
;
到目前为止还不错,但不知何故受到固定级别数量的限制。 我可以根据实际用例自定义它(根据找到的层次结构的实际深度添加级别)。
是否有一种不同的方法可以适应层次结构的深度?
实际输出是
sum;sum;sum;37780;301
DBC;sum;sum;37780;301
DBC;;sum;34369;125
DBC;;;34369;125
DBC;All;sum;0;0
DBC;All;;0;0
DBC;Crashdumps;sum;71;0
DBC;Crashdumps;;71;0
...
DBC;Samples;sum;1215;159
DBC;Samples;;9;0
DBC;Samples;financial;12;11
DBC;Samples;manufacturing;0;0
DBC;Samples;retail;22;21
DBC;Samples;sandbox;1024;0
DBC;Samples;tpch;52;46
DBC;Samples;transportation;0;0
DBC;Samples;twm_md;76;70
DBC;Samples;twm_results;4;0
DBC;Samples;twm_source;11;9
...
DBC;SysAdmin;sum;1043;2
DBC;SysAdmin;;19;2
DBC;SysAdmin;user1;1024;0
没关系。我得到了 user1 和 Samples 的总和。但是,如果我添加一个级别,比如说 user1 拥有的其他数据库,我必须添加一个额外的级别。添加级别或连接的数据库名称在汇总中不起作用(至少我没有让它起作用)。我想要那个级别中每个名字的总和。
最终目标是按组了解空间使用情况,这些组位于层次结构中的不同级别。如果将 user1 移动到 DBC->GroupSpace->Group7->Project1->Subproject5->SandBox,SQL 应该仍然有效。 我希望能够回答有关 Group7 内整体和详细空间使用情况的问题
【问题讨论】:
-
你能提供一个你想要的输出的例子吗?我怀疑您应该将输出放在单独的行而不是单独的列上。