使用treemaps图形化表示数据库

ZDNet软件频道 时间:2004-04-28 作者:Builder.com |  我要评论()
本文关键词:oracletips
在一个 Oracle 数据库中,DBA 经常要寻找快要用完的表空间,然后要么增加一个新的数据文件,要么删除旧的数据,从而保证应用程序不至于出于因空间错误而失败。
本文译自Builder.com,未经许可请勿转载

在一个 Oracle 数据库中,DBA 经常要寻找快要用完的表空间,然后要么增加一个新的数据文件,要么删除旧的数据,从而保证应用程序不至于出于因空间错误而失败。我想将treemaps应用到这个问题上可能非常有趣。我发现到从一个数据库查询中产生一个图形图像在各种环境下有区别,因此我决定将这分两部分写这篇文章。

第一部分讨论使用 PHP 文件产生 PNG 图像;第二部分则分析使用modplsql从 PL/SQL 产生一个 SVG 格式的图像。大多数浏览器都支持 PNG 格式的图像文件,但是并不是每个人都安装了 PHP 服务器。然而将相同的代码应用到其它服务器上相当简单,比如说应用到 Java servlet上,Java servlet具有动态产生图像文件的能力。

有几种不同的算法可以用来产生treemap。我选择 pivot 算法,该算法能够避免一个常见的问题,即非常小的数据会挤到另外一个小区域内。

在这个例子中,我想要产生一个treemap,使用该treemap来包含一个矩形表示每一个表空间。每个矩形都用绿色、黄色和红色三种颜色不同的深浅度标出,并用此法显示在每个表空间中还有多少自由空间。绿色表空间表示有很多自由空间,黄色表空间表示自由空间还有一半,红色表空间表示已经几乎没有自由空间。在每个基本颜色之间我们使用不同的深浅度。(相比查看一大堆表空间大小和百分比来说这样可读性更好。)

数据和表现之间可能的结合有无数种。Treemaps非常擅长显示有很多条目的数据。对这个例子进行扩展,可以将每个矩形再分成小矩形,分别用来表示每个数据文件,相应地还可以继续再分成更小的矩形,分别用来表示已用的或自由的区域(extent)。我们还要编写一个小程序来显示 SGA 分配和使用统计情况。

为了生成用于产生图表的数据,我需要 DBA_DATA_FILES(里面有已分配的总空间数)和DBA_FREE_SPACE。我可以通过拿“总字节数”减去“已用字节数”来计算“自由字节数”,从而避免查询自由 extent 表。这个视图的 USER_ 和 ALL_ 版本不能查看到所有的数据,但是我不想将 DBA 权限给那些想得到这些数据的人。所以我拆开了 DNA_DATA_FILES 和 DBA_FREE_SPACE,从中先删除了不相关的表,然后将它们合并到了一个单独的视图中,使用该视图显示已用的空间(自由空间为“0”)和自由空间(已用空间为“0”)。这样就提高了查询速度,而且通过将这个视图授权给 PUBLIC,任何数据库用户都可以访问其数据。

下面是我的视图定义,数据库版本为 Oracle 9.2.0.1.0。

create or replace view treemap_data_view

as

selectts.nametablespace_name,

       0 free_bytes,

       ts.blocksize * f.blocksused_bytes,

       ts.blocksize * f.blockstotal_bytes

  fromsys.file$ f, sys.ts$ ts

 where f.spare1 is null

   andf.ts# = ts.ts#

union all

selectts.name,

       0,

       decode(hc.ktfbhccval,0,ts.blocksize * hc.ktfbhcsz,null),

       decode(hc.ktfbhccval,0,ts.blocksize * hc.ktfbhcsz,null)

  fromsys.ts$ ts, sys.x$ktfbhchc

wherehc.ktfbhctsn = ts.ts#

union all

selectts.name,

       f.length * ts.blocksize,

       0,

       f.length * ts.blocksize

fromsys.ts$ ts, sys.fet$ f

wherets.ts# = f.ts#

  andts.bitmapped = 0

union all

selectts.name,

       f.ktfbfeblks * ts.blocksize,

       0,

       f.ktfbfeblks * ts.blocksize

fromsys.ts$ ts, sys.x$ktfbfe f

wherets.ts# = f.ktfbfetsn

  andts.bitmapped <> 0 and ts.online$ in (1,4) and ts.contents$ = 0;

 

grant select on treemap_data_view to public;


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134