用Oracle实现ASH的数据透视图
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的数据透视图的更多相关文章
- [转]Oracle数据库ASH和AWR的简单介绍
在Oracle数据库中,有时我们可能会遇到这样的术语:ASH和AWR,那么它们是怎样产生的呢?它们的作用又是什么呢?本文我们就来介绍这一部分内容. 1.10g之前 用户的连接将产生会话,当 ...
- Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)
<Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...
- Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)
<Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...
- 将Oracle数据库中的数据写入Excel
将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...
- Oracle 查询出来的数据取第一条
Oracle 查询出来的数据取第一条 --------------------------------------------------------------------------- 转载自:h ...
- 利用闪回查看Oracle表历史时刻数据
利用闪回查看Oracle表历史时刻数据 1.查看表历史时刻数据 select * from tab_test AS OF TIMESTAMP to_timestamp('20140917 10:00: ...
- oracle 跨数据库取数据
思路:先从另一个数据库里把数据取出来, 然后,把这个数据集合解析,根据这个数据集合拆分组合成一个创建oralce临时表的方法及数据的插入.紧接着就可以写sql语句进行联合查询了. 下面是具体实例的方法 ...
- 使用oracle外部表进行数据泵卸载数据
数据泵卸载Oracle9i引入了外部表,作为向数据库中读取数据的一种方法.Oracle 10g则从另一个方向引入了这个特性,可以使用CREATE TABLE语句创建外部数据,从而由数据库卸载数据.从O ...
- 【转】Oracle 表空间与数据文件
--============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或 ...
随机推荐
- 【c语言】推断一个数是奇偶数
// 推断一个数是奇偶数 #include <stdio.h> void judge_sd(int a) { if ((a & 1) == 0) { printf("是偶 ...
- 基于mvcpager的分页(get请求,刷新页面),提供两种样式(来自bootstrap的样式)
使用方法:先把mvcpager.dll引用加入mvc项目 下载路径在本文末尾 前台代码 前台: @{ Layout = null; } @using Webdiyer.WebControls.Mvc ...
- 【Java面试题】28 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点:Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一定要 ...
- apk 反编译工具的使用
在学习android 开发的时候,我们经常回尝试使用到别人的apk,希望能了解别人怎么编写的代码,于是想要一个能实现其反编译的软件,将软件反编译出来,查看其代码. 工具/原料 反编译软件dex2jar ...
- NHibernate初学六之关联多对多关系
1:创建三张表T_Course.T_Student.T_Middle:其中一个学生可以对应多个课程,一个课程也可以对应多个学生,用T_Middle存放它们的关系内容: CREATE TABLE [db ...
- 把Excel中的数据转换成Sql语句
假如excel表格中有A.B.C三列数据,希望导入到数据库users表中,相应的字段各自是name,sex,age ,在你的excel表格中添加一列.利用excel的公式自己主动生成sql语句,方法例 ...
- 关于C中I/O缓冲区的解释
用户程序调用C标准I/O库函数读写文件或设备,而这些库函数要通过系统调用把读写请求传给内核,最终由内核驱动磁盘或设备完成I/O操作.C标准库为每个打开的文件分配一个I/O缓冲区以加速读写操作,通过文件 ...
- 高性能LAMP程序设计
高性能LAMP程序设计 原文地址: http://www.infoq.com/cn/presentations/fcq-high-performance-lamp-programming 演讲稿: h ...
- 使用React写的一个小小的登录验证密码组件
哎,算了.直接上代码吧,不懂得私聊我把 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- Java语言基本数据类型
■Java是一种强类型语言,每个变量都必须声明其类型.■Java的数据类型分为两大类:基本类型和引用类型(引用数据类型的大小统一为4个字节,记录的是其引用对象的地址).■Java中定义了3类8种基本数 ...