查看完整版本: [贴图]主机繁忙程度制作过程

forreport 2008-6-3 11:03

[贴图]主机繁忙程度制作过程

[font=Times New Roman][img]http://finesoftware.k13.23dns.net/picFforum/pic1.png[/img][/font]
[font=宋体]这是一个常见的能够衡量一台机器的繁忙程度的报表。[/font]
[font=宋体]看似简单,也就是一张报表当中放置了多个图表。但实际上由于数据库的单表数据量近亿,直接取数据几乎是不可能的。[/font]
[font=宋体]并且由于数据库表并不算科学,也就是要要做这个表,需要从四张不同的数据库表当中取数据。我埋头查了好久,才算把这个[/font][font=Times New Roman]SQL[/font][font=宋体]搞定,贡献出来给大家分享一下。[/font]
[font=Times New Roman]Select [/font]
[font=Times New Roman]
A.HOST as HOST,[/font]
[font=Times New Roman]
B.PARAMETER.NAME as PARAMETER,[/font]
[font=Times New Roman]
TO_DATE('1970-01-01','yyyy-mm-dd') + trunc(C.TIMESTAMP/(1000*60*60*24)) as DATES,[/font]
[font=Times New Roman]SUBSTR(TO_CHAR(TO_DATE('1970-01-01','yyyy-mm-dd hh24:mi:ss') + C.TIMESTAMP/(1000*60*60*24),'yyyy-mm-dd hh24:mi:ss'),12,2) as HOURS,[/font]
[font=Times New Roman]
TO_NUMBER(C.VALUE) as VALUE[/font]
[font=Times New Roman]from[/font]
[font=Times New Roman]
(select * from A where HOST='[?HOST|SERVER6?]') A inner join D D on A.GUID = D.HOST[/font]
[font=Times New Roman]
Inner join (select * from B where B.PARAMETERNAME='CPU'[/font]
[font=Times New Roman]OR B.PARAMETERNAME='MEMORY'[/font]
[font=Times New Roman]OR B.PARAMETERNAME='DSKBUSY'[/font]
[font=Times New Roman]OR B.PARAMETERNAME='IO'[/font]
[font=Times New Roman]OR B.PARAMETERNAME='FSPERCENT'[/font]
[font=Times New Roman]OR B.PARAMETERNAME='FSSpace')) B on D.GUID = B.APPLICATION inner join C C on B.GUID = C.AGENT[/font]
[font=Times New Roman]where TO_DATE('1970-01-01','yyyy-mm-dd') + trunc(C.TIMESTAMP/(1000*60*60*24))>=TO_DATE('[?start|2008-04-05?]','yyyy-mm-dd')[/font]
[font=Times New Roman]and TO_DATE('1970-01-01','yyyy-mm-dd') + trunc(C.TIMESTAMP/(1000*60*60*24))<=TO_DATE('[?end|2008-04-12?]','yyyy-mm-dd')[/font]
[font=Times New Roman] [/font]
[font=宋体]在这个[/font][font=Times New Roman]SQL[/font][font=宋体]里面,首先数据是存在[/font][font=Times New Roman]oracle[/font][font=宋体]数据库里面的,我面对的第一个问题,就是数据库当中存储的时间都是时间戳,也就是距离[/font][font=Times New Roman]1970[/font][font=宋体]年[/font][font=Times New Roman]1[/font][font=宋体]月[/font][font=Times New Roman]1[/font][font=宋体]号零点的毫秒数。需要将其转化为我们常用的[/font][font=Times New Roman]yyyy-MM-dd[/font][font=宋体]格式。我一点感觉就是应该用[/font][font=Times New Roman]to_date[/font][font=宋体]函数。但是只有一个[/font][font=Times New Roman]to_date[/font][font=宋体]似乎是不能完成彻底的转化。[/font]
[font=宋体]怎么办呢,[/font][font=Times New Roman]google[/font][font=宋体],[/font][font=Times New Roman]baidu[/font][font=宋体]了无数,都没有找到答案,谁让我不懂什么[/font][font=Times New Roman]SQL[/font][font=宋体]呢,书到用时方恨少![/font]
[font=宋体]一定要把我使用的查询关键词写出来,方便以后哪个兄弟用同样的关键词,至少能搜到我这个答案啊。“毫秒转化为时间”。当然大家肯定也看到了,我转化的方法就是[/font][font=Times New Roman]TO_DATE('1970-01-01','yyyy-mm-dd') + trunc(C.TIMESTAMP/(1000*60*60*24))[/font][font=宋体]和[/font][font=Times New Roman]TO_CHAR(TO_DATE('1970-01-01','yyyy-mm-dd hh24:mi:ss') + C.TIMESTAMP/(1000*60*60*24),'yyyy-mm-dd hh24:mi:ss'),12,2)[/font][font=宋体],这两者的区别就是,前者只取年月日,后者则将小时分秒都取出来。[/font]
[font=宋体]日期型的问题解决了,然后又有一个严重的问题冒出来了,数据量太大,在[/font][font=Times New Roman]PL/SQL[/font][font=宋体]里面执行,都需要花超过一小时的时间,这个肯定是不能让人接受的。我只好又埋头钻研[/font][font=Times New Roman]SQL[/font][font=宋体]优化,当当当当,成功的把执行时间降低到了[/font][font=Times New Roman]0.47[/font][font=宋体]秒![/font]
[font=宋体]主要的优化方法,就是把[/font][font=Times New Roman]where[/font][font=宋体]条件,大部分放到[/font][font=Times New Roman]inner join[/font][font=宋体]那里去做。说起来其实挺简单,是吧。[/font]
[font=宋体]然后说说报表吧,这个报表是在一张表当中体现了四个图表,一个日趋势,其它三个都是周趋势。其中第一个图和第二图的统计的指标是一样的,分别都是[/font][font=Times New Roman]CPU[/font][font=宋体]利用率,内存利用率和磁盘的利用率。这三个指标的组合往往能够代表一台机器的繁忙程度。[/font]
[font=宋体]然后还有一个图是磁盘的忙率比率,以及文件系统的平均可用空间。[/font]
[font=宋体]设计的方法就没有什么难度好说了,因为我用的[/font][font=Times New Roman]FineReport[/font][font=宋体],做这个报表就是小菜一碟了。直接把刚刚定义好的列拖过来,一个小时,一个日期,两个时间字段分别放到[/font][font=Times New Roman]B3C3[/font][font=宋体]格子里面。左边[/font][font=Times New Roman]A4[/font][font=宋体]到[/font][font=Times New Roman]A8[/font][font=宋体]手工写上指标名字或者将库里面的指标名字拖来,中间拖数据过来。就[/font][font=Times New Roman]OK[/font][font=宋体]。[/font][font=Times New Roman] [/font][font=宋体]然后直接插入图表,选择好数据区域就可以了。[/font][font=Times New Roman]Just like excel~[/font]
[font=宋体]当然,这个表要体现的图表,当然可以不用拖拽数据到报表里面,直接写[/font][font=Times New Roman]SQL[/font][font=宋体]做图表了。不过,我比较懒,不想写[/font][font=Times New Roman]4[/font][font=宋体]次[/font][font=Times New Roman]SQL[/font][font=宋体],所以,就先把数据拖过来,获得图表要体现的数据,再直接从格子里面读了。所以最后最后,我不想在报表里面看到数据,只要图表,隐藏数据区域就好了。就这么简单。[/font]
[font=Times New Roman] [/font][font=宋体]最后一点,在前面的[/font][font=Times New Roman]SQL[/font][font=宋体]里面我想大家都看到了,这个报表是有参数的。对这太平常不过了,好像每一张报表都会有时间参数的,没有人说,我不管时间,只统计所有的结果吧。以前用别的工具的时候,有参数的报表,都需要通过自己手写一些[/font][font=Times New Roman]JSP[/font][font=宋体]或者什么其他的,在页面里面把参数查询的框子弄出来。[/font]
[font=宋体]但是我不得不重申一次,我比较懒,不喜欢什么都要自己写(当然写上面那个[/font][font=Times New Roman]SQL[/font][font=宋体],我也嫌麻烦,但是没办法啊,谁让数据量大呢,连[/font][font=Times New Roman]Oracle[/font][font=宋体]自己查询都会[/font][font=Times New Roman]out of memory[/font][font=宋体])。如果参数可以通过拖拖拽拽,访问报表时候就自动会有这么一个参数页面,该多好。[/font]
[font=Times New Roman]     [/font][font=宋体]听说汽车的发明是因为人懒得走路,那么我这种懒人,会不会促进软件越来越人性化呢?答案当然是。所以,就是说,我用的[/font][font=Times New Roman]FineReport[/font][font=宋体],是可以这样的。报表里面有什么参数,我只需要把它定位一个位置,访问报表的时候,就可以直接弹出或者有个内嵌的参数查询框子了。溜个图:[/font]
[font=Times New Roman][img]http://finesoftware.k13.23dns.net/picFforum/canshu1.png[/img][/font]
[font=宋体]具体怎么做,就不多说了,他们家软件的帮助文档写的挺详细的。有兴趣的可以到他们网站[/font][font=Times New Roman]down[/font][font=宋体]一个看看。地址:[/font][url=http://www.finereport.com/][font=Times New Roman][color=#0000ff]www.finereport.com[/color][/font][/url][font=Times New Roman] [/font]
页: [1]
查看完整版本: [贴图]主机繁忙程度制作过程