11g里面有个很有用的新特性,对数据透视图的支持。

简单而言,它可以实现宽表和窄表之间的转化。举一个例子,有一张表记录了全校所有班级所有学生的成绩(A,B,C,D,E),现在想统计每个班级里每个分数级别对应的学生人数。当然,一个SQL就可以实现:

SELECT class, score, count(*) FROM score_table

GROUP BY class, score;

结果的格式如下:

班级 分数 人数

一年一班     A  10

一年一班     B  16

一年一班     C  16

一年一班     D  16

一年一班     E  16

一年二班     A  15

一年二班     B  14

一年二班     C  15

一年二班     D  14

一年二班     E  15

不过,很多人更想要下面的格式

班级        A    B   C   D   E

一年一班   10   16  16  16  16

一年二班   15   14  15  14  15

第二种格式显然简单明了多了。

用Oracle的新语法,可以实现如下

SELECT *

FROM

(

SELECT class,score,count(*) cnt

FROM score_table

GROUP BY class,score

)

pivot

(

sum(cnt) FOR score IN ('A','B','C','D','E')

)

;

一个更实用的场合是对ASH(active session history)数据的处理上。

一般而言,我们需要一段时间内Top 10的wait event,并掌握其在每个时间片(例如10 seconds)里的分布。这些信息可以通过下面的SQL进行获取:

SELECT

to_char(to_date(trunc(to_char(sample_time,'SSSSS')/10)*10,'SSSSS'),'hh24:mi:ss') start_time

, decode(ash.session_state,'ON CPU','ON CPU',ash.event)     event

, count(1)/10 total

FROM

v$active_session_history ash

WHERE

sample_time > sysdate-1/24

GROUP BY  trunc(to_char(sample_time,'SSSSS')/10)

,  decode(ash.session_state,'ON CPU','ON CPU',ash.event)

;

同样的,我们更习惯将这个结果进行倒置。这同样可以通过pivot来实现:

SELECT * FROM

(SELECT

to_char(to_date(trunc(to_char(sample_time,'SSSSS')/10)*10,'SSSSS'),'hh24:mi:ss') start_time

, decode(ash.session_state,'ON CPU','ON CPU',ash.event)     event

, count(1)/10 total

FROM

v$active_session_history ash

WHERE

sample_time >  sysdate-1/24

GROUP BY  trunc(to_char(sample_time,'SSSSS')/10)

,  decode(ash.session_state,'ON CPU','ON CPU',ash.event)

) ash       

pivot (sum(total) FOR event IN ('ON CPU' AS TOP1,'PX Deq: Slave Session Stats' AS TOP2))

ORDER BY 1;

下面是一个ASH的例子,系统的工作状态已经一目了然了!

TOP   EVENT

----- ----------------------------------------------------------------

TOP1  cell smart table scan

TOP2  ASM file metadata operation

TOP3  control file sequential read

TOP4  ON CPU

TOP5  enq: XL - fault extent map

TOP6  DFS lock handle

TOP7  cell single block physical read

TOP8  reliable message

TOP9  read by other session

TOP10 latch: shared pool

TIME      TOP1  TOP2  TOP3  TOP4  TOP5  TOP6  TOP7  TOP8  TOP9 TOP10

-------- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----

00:30:50                       1

00:31:30

00:31:40

00:31:50

00:32:10

00:32:30

00:32:50                       1

00:34:10

00:34:30                       1

00:34:40

00:35:10                       1

00:35:40                       1

00:37:50    16    34     5     9     2           1    14     3     9

00:38:00   296    95     7     9     3           6     1     6

00:38:10   478   133    15     4    17           7           1

00:38:20   543    71    21     6     8           7           5

00:38:30   531    81    13     2    14           9     1     2

00:38:40   600    30    17     4     2     1     2

00:38:50   592    36    16     4     5    10     1

00:39:00   609    20    12     6          10           4

00:39:10   620    14    13     4     2    10

00:39:20   628     5    10     4          10     1

00:39:30   248     7     4                 4           4

用Oracle实现ASH的数据透视图的更多相关文章

  1. [转]Oracle数据库ASH和AWR的简单介绍

    在Oracle数据库中,有时我们可能会遇到这样的术语:ASH和AWR,那么它们是怎样产生的呢?它们的作用又是什么呢?本文我们就来介绍这一部分内容.       1.10g之前 用户的连接将产生会话,当 ...

  2. Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)

    <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...

  3. Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)

    <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...

  4. 将Oracle数据库中的数据写入Excel

    将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...

  5. Oracle 查询出来的数据取第一条

    Oracle 查询出来的数据取第一条 --------------------------------------------------------------------------- 转载自:h ...

  6. 利用闪回查看Oracle表历史时刻数据

    利用闪回查看Oracle表历史时刻数据 1.查看表历史时刻数据 select * from tab_test AS OF TIMESTAMP to_timestamp('20140917 10:00: ...

  7. oracle 跨数据库取数据

    思路:先从另一个数据库里把数据取出来, 然后,把这个数据集合解析,根据这个数据集合拆分组合成一个创建oralce临时表的方法及数据的插入.紧接着就可以写sql语句进行联合查询了. 下面是具体实例的方法 ...

  8. 使用oracle外部表进行数据泵卸载数据

    数据泵卸载Oracle9i引入了外部表,作为向数据库中读取数据的一种方法.Oracle 10g则从另一个方向引入了这个特性,可以使用CREATE TABLE语句创建外部数据,从而由数据库卸载数据.从O ...

  9. 【转】Oracle 表空间与数据文件

    --============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或 ...

随机推荐

  1. 更改windows 2003远程桌面端口3389为其他的端口号【转】

    众所周知,windows 2003远程终端服务基于默认端口3389.入侵者一般先扫描主机开放端口,一旦发现其开放了3389端口,就会进行下一步的入侵,所以我们只需要修改该务默认端口就可以避开大多数入侵 ...

  2. yasm开源汇编器分析

    https://www.google.com.hk/search?q=yasm&oq=yasm&aqs=chrome..69i57&sourceid=chrome&es ...

  3. 为什么要整合apache 和tomcat?

    1. Apache是web服务器,Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展. 2. Apache和Tomcat都可以做为独立的web服务器来运行,但是A ...

  4. java导出word文件

    java导出word文件 test5.ftl文件生存方法, 第一步:用word新建test5.doc,填写完整模板,将需导出数据用${}代替 第二步:将test5.doc另存为test5.xml 第三 ...

  5. Ubuntu 使用文件 casper-rw 镜像文件 保存变更内容

    yumi工具本可以制作基于u盘的persistent启动盘 casper-rw是ubuntu特有的一种功能,支持liveCD启动的ubuntu系统保存用户的变更内容 那我们想同iso光盘从硬盘上启动, ...

  6. HEVC有损优化二

    1 .  HEVC有很些设置对速度的提升有很大的帮助,比如m_bUseEarlyCU,m_useEarlySkipDetection等. 把它们设置成true,会有意想不到的效果. 比如对于不同分辨率 ...

  7. [java ] java.util.zip.ZipException: error in opening zip file

    严重: Failed to processes JAR found at URL [jar:file:/D:/tools/apache-tomcat-7.0.64_2/webapps/bbs/WEB- ...

  8. tiny6410的linux操作系统实验开发

    ---恢复内容开始--- 1.前期由于2440 的4.3寸屏太小.后来修改程序准备在tiny6410增强版的S70屏上用.但是前期移植再用yaffs的文件系统,但是6410是(MLC)的磁盘,根本就不 ...

  9. Swift - UITableView的用法

    因为倾向于纯代码编码,所以不太喜欢可视化编程,不过也略有研究,所以项目里面的所有界面效果,全部都是纯代码编写! 终于到了重中之重的tableview的学习了,自我学习ios编程以来,工作中用得最多的就 ...

  10. python2.0_s12_day13_javascript&Dom&jQuery

    今天主要内容:JavaScriptDomjQuery http://www.cnblogs.com/wupeiqi/articles/5369773.html 今天主要内容大致了解:javascrip ...