<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OS与Oracle &#187; unpivot</title>
	<atom:link href="http://www.os2ora.com/tag/unpivot/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.os2ora.com</link>
	<description>专注于现实世界Oracle数据库的高性能，高可扩展性与新一代数据库Exadata架构</description>
	<lastBuildDate>Mon, 19 Sep 2011 09:10:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>用Oracle实现ASH的数据透视图</title>
		<link>http://www.os2ora.com/ash-pivot-by-oracle/</link>
		<comments>http://www.os2ora.com/ash-pivot-by-oracle/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 17:45:25 +0000</pubDate>
		<dc:creator>Kaya</dc:creator>
				<category><![CDATA[数据库性能调优]]></category>
		<category><![CDATA[active session history]]></category>
		<category><![CDATA[ASH]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[pivot]]></category>
		<category><![CDATA[unpivot]]></category>
		<category><![CDATA[数据透视图]]></category>

		<guid isPermaLink="false">http://www.os2ora.com/ash-pivot-by-oracle/</guid>
		<description><![CDATA[11g里面有个很有用的新特性，对数据透视图的支持。简单而言，它可以实现宽表和窄表之间的转化。举一个例子，有一张表记录了全校所有班级所有学生的成绩(A,B,C,D,E)，现在想统计每个班级里每个分数级别对应的学生人数......]]></description>
			<content:encoded><![CDATA[<p>Kaya 发表于 <a href="http://www.os2ora.com">os2ora.com</a></p>
<p>11g里面有个很有用的新特性，对数据透视图的支持。</p>
<p>简单而言，它可以实现宽表和窄表之间的转化。举一个例子，有一张表记录了全校所有班级所有学生的成绩(A,B,C,D,E)，现在想统计每个班级里每个分数级别对应的学生人数。当然，一个SQL就可以实现：</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> class<span style="color: #66cc66;">,</span> score<span style="color: #66cc66;">,</span> count<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> score_table
<span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span> class<span style="color: #66cc66;">,</span> score;</pre></div></div>

<p>结果的格式如下：</p>
<pre>班级      分数 人数
一年一班     A  10
一年一班     B  16
一年一班     C  16
一年一班     D  16
一年一班     E  16
一年二班     A  15
一年二班     B  14
一年二班     C  15
一年二班     D  14
一年二班     E  15</pre>
<p>不过，很多人更想要下面的格式</p>
<pre>班级        A    B   C   D   E
一年一班   10   16  16  16  16
一年二班   15   14  15  14  15</pre>
<p>第二种格式显然简单明了多了。</p>
<p>用Oracle的新语法，可以实现如下</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span>
<span style="color: #993333; font-weight: bold;">FROM</span>
<span style="color: #66cc66;">&#40;</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> class<span style="color: #66cc66;">,</span>score<span style="color: #66cc66;">,</span>count<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span> cnt
<span style="color: #993333; font-weight: bold;">FROM</span> score_table
<span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span> class<span style="color: #66cc66;">,</span>score
<span style="color: #66cc66;">&#41;</span>
pivot
<span style="color: #66cc66;">&#40;</span>
sum<span style="color: #66cc66;">&#40;</span>cnt<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FOR</span> score <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'A'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'B'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'C'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'D'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'E'</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>
;</pre></div></div>

<p>一个更实用的场合是对ASH(active session history)数据的处理上。</p>
<p>一般而言，我们需要一段时间内Top 10的wait event，并掌握其在每个时间片(例如10 seconds)里的分布。这些信息可以通过下面的SQL进行获取:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span>
    to_char<span style="color: #66cc66;">&#40;</span>to_date<span style="color: #66cc66;">&#40;</span>trunc<span style="color: #66cc66;">&#40;</span>to_char<span style="color: #66cc66;">&#40;</span>sample_time<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SSSSS'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SSSSS'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'hh24:mi:ss'</span><span style="color: #66cc66;">&#41;</span> start_time
  <span style="color: #66cc66;">,</span> decode<span style="color: #66cc66;">&#40;</span>ash<span style="color: #66cc66;">.</span>session_state<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'ON CPU'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'ON CPU'</span><span style="color: #66cc66;">,</span>ash<span style="color: #66cc66;">.</span>event<span style="color: #66cc66;">&#41;</span>     event
  <span style="color: #66cc66;">,</span> count<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">10</span> total
<span style="color: #993333; font-weight: bold;">FROM</span>
   v$active_session_history ash
<span style="color: #993333; font-weight: bold;">WHERE</span>
          sample_time &amp;gt; sysdate<span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">24</span>
<span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span>  trunc<span style="color: #66cc66;">&#40;</span>to_char<span style="color: #66cc66;">&#40;</span>sample_time<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SSSSS'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">,</span>  decode<span style="color: #66cc66;">&#40;</span>ash<span style="color: #66cc66;">.</span>session_state<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'ON CPU'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'ON CPU'</span><span style="color: #66cc66;">,</span>ash<span style="color: #66cc66;">.</span>event<span style="color: #66cc66;">&#41;</span>
;</pre></div></div>

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

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span>
    to_char<span style="color: #66cc66;">&#40;</span>to_date<span style="color: #66cc66;">&#40;</span>trunc<span style="color: #66cc66;">&#40;</span>to_char<span style="color: #66cc66;">&#40;</span>sample_time<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SSSSS'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SSSSS'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'hh24:mi:ss'</span><span style="color: #66cc66;">&#41;</span> start_time
  <span style="color: #66cc66;">,</span> decode<span style="color: #66cc66;">&#40;</span>ash<span style="color: #66cc66;">.</span>session_state<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'ON CPU'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'ON CPU'</span><span style="color: #66cc66;">,</span>ash<span style="color: #66cc66;">.</span>event<span style="color: #66cc66;">&#41;</span>     event
  <span style="color: #66cc66;">,</span> count<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">10</span> total
<span style="color: #993333; font-weight: bold;">FROM</span>
   v$active_session_history ash
<span style="color: #993333; font-weight: bold;">WHERE</span>
          sample_time &amp;gt;  sysdate<span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">24</span>
<span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span>  trunc<span style="color: #66cc66;">&#40;</span>to_char<span style="color: #66cc66;">&#40;</span>sample_time<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'SSSSS'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">,</span>  decode<span style="color: #66cc66;">&#40;</span>ash<span style="color: #66cc66;">.</span>session_state<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'ON CPU'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'ON CPU'</span><span style="color: #66cc66;">,</span>ash<span style="color: #66cc66;">.</span>event<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span> ash
pivot <span style="color: #66cc66;">&#40;</span>sum<span style="color: #66cc66;">&#40;</span>total<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FOR</span> event <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'ON CPU'</span> <span style="color: #993333; font-weight: bold;">AS</span> TOP1<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'PX Deq: Slave Session Stats'</span> <span style="color: #993333; font-weight: bold;">AS</span> TOP2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #cc66cc;">1</span>;</pre></div></div>

<p>下面是一个ASH的例子，系统的工作状态已经一目了然了！</p>
<pre>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</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.os2ora.com/ash-pivot-by-oracle/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

