<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: Detect chained and migrated rows in Oracle &#8211; Part 1</title>
	<atom:link href="http://blog.tanelpoder.com/2009/11/04/detect-chained-and-migrated-rows-in-oracle/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tanelpoder.com/2009/11/04/detect-chained-and-migrated-rows-in-oracle/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=detect-chained-and-migrated-rows-in-oracle</link>
	<description>Oracle, Exadata, Performance, Troubleshooting - Mobile Life and Productivity.</description>
	<lastBuildDate>Wed, 08 Feb 2012 08:03:50 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>By: Marek</title>
		<link>http://blog.tanelpoder.com/2009/11/04/detect-chained-and-migrated-rows-in-oracle/comment-page-1/#comment-11405</link>
		<dc:creator>Marek</dc:creator>
		<pubDate>Wed, 08 Feb 2012 08:03:50 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tanelpoder.com/?p=479#comment-11405</guid>
		<description>Hi Tanel,
thanks for this excellent work. The query I made based on your article for detecting row migration.
Kind regards.

SELECT  
	NVL(VSE.USERNAME,&#039;BACKGROUND&#039;) USERNAME, 
	VSE.SID, 
	VSE.PROGRAM, 
	TFCR.VALUE AS &quot;TABLE FETCH CONTINUED ROW&quot;, 
	TFBR.VALUE AS &quot;TABLE FETCH BY ROWID&quot;, 
	ROUND(((1-(TFBR.VALUE-TFCR.VALUE)/TFBR.VALUE))*100,2) AS RATIO 
FROM 
	(	 
	SELECT  
		VSE.SID, VSE.VALUE  
	FROM  
		V$SESSTAT VSE  
			INNER JOIN V$STATNAME VSN  
				ON VSE.STATISTIC#=VSN.STATISTIC# 
	WHERE  
		UPPER(VSN.NAME)=&#039;TABLE FETCH CONTINUED ROW&#039; 
	) TFCR 
		INNER JOIN 
			( 
			SELECT  
				VSE.SID, VSE.VALUE  
			FROM  
				V$SESSTAT VSE  
					INNER JOIN V$STATNAME VSN  
						ON VSE.STATISTIC#=VSN.STATISTIC# 
			WHERE  
				UPPER(VSN.NAME)=&#039;TABLE FETCH BY ROWID&#039; 
			) TFBR 
				ON TFCR.SID=TFBR.SID 
	INNER JOIN 
		V$SESSION VSE 
			ON TFCR.SID=VSE.SID 
WHERE 
	TFCR.VALUE&gt;0 
ORDER BY VSE.USERNAME</description>
		<content:encoded><![CDATA[<p>Hi Tanel,<br />
thanks for this excellent work. The query I made based on your article for detecting row migration.<br />
Kind regards.</p>
<p>SELECT<br />
	NVL(VSE.USERNAME,&#8217;BACKGROUND&#8217;) USERNAME,<br />
	VSE.SID,<br />
	VSE.PROGRAM,<br />
	TFCR.VALUE AS &#8220;TABLE FETCH CONTINUED ROW&#8221;,<br />
	TFBR.VALUE AS &#8220;TABLE FETCH BY ROWID&#8221;,<br />
	ROUND(((1-(TFBR.VALUE-TFCR.VALUE)/TFBR.VALUE))*100,2) AS RATIO<br />
FROM<br />
	(<br />
	SELECT<br />
		VSE.SID, VSE.VALUE<br />
	FROM<br />
		V$SESSTAT VSE<br />
			INNER JOIN V$STATNAME VSN<br />
				ON VSE.STATISTIC#=VSN.STATISTIC#<br />
	WHERE<br />
		UPPER(VSN.NAME)=&#8217;TABLE FETCH CONTINUED ROW&#8217;<br />
	) TFCR<br />
		INNER JOIN<br />
			(<br />
			SELECT<br />
				VSE.SID, VSE.VALUE<br />
			FROM<br />
				V$SESSTAT VSE<br />
					INNER JOIN V$STATNAME VSN<br />
						ON VSE.STATISTIC#=VSN.STATISTIC#<br />
			WHERE<br />
				UPPER(VSN.NAME)=&#8217;TABLE FETCH BY ROWID&#8217;<br />
			) TFBR<br />
				ON TFCR.SID=TFBR.SID<br />
	INNER JOIN<br />
		V$SESSION VSE<br />
			ON TFCR.SID=VSE.SID<br />
WHERE<br />
	TFCR.VALUE&gt;0<br />
ORDER BY VSE.USERNAME</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Andrew</title>
		<link>http://blog.tanelpoder.com/2009/11/04/detect-chained-and-migrated-rows-in-oracle/comment-page-1/#comment-6778</link>
		<dc:creator>Andrew</dc:creator>
		<pubDate>Thu, 24 Mar 2011 18:52:29 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tanelpoder.com/?p=479#comment-6778</guid>
		<description>Hi Tanel,
may I ask you when do plan to publish Part 2 of your very interesting article?

Thanks.
Andrew</description>
		<content:encoded><![CDATA[<p>Hi Tanel,<br />
may I ask you when do plan to publish Part 2 of your very interesting article?</p>
<p>Thanks.<br />
Andrew</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Donatello Settembrino</title>
		<link>http://blog.tanelpoder.com/2009/11/04/detect-chained-and-migrated-rows-in-oracle/comment-page-1/#comment-3928</link>
		<dc:creator>Donatello Settembrino</dc:creator>
		<pubDate>Thu, 25 Feb 2010 17:02:50 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tanelpoder.com/?p=479#comment-3928</guid>
		<description>Hi Tanel,
Your interesting post has confirmed me a consideration that I did some time ago, or rather  to consider effectively costs and benefits.For the migrated rows it could think to do an ALTER TABEL T MOVE to allow at a migrate row to fit it in a single block. But, I think it&#039;s not very easy, because after an ALTER TABLE..MOVE I should do REBUILD of the index, because if I don&#039;t do it, the query it will not be able to use the index that remains in a unusable status. And if the indexes are more than one? The operation could start to become costly...


If I use ALTER TABLE..SHRINK SPACE I can bypass the indexes problem and reuse the space. But if my table, is a partitioned table with storical data and with several hundreds of millions of lines and I realize that there are migrated rows (and I have a performance problem) maybe I should isolate the problem at partition level and execute SHRINK on the single partition, provided that&#039;s worth it.


Surely, this conversation it&#039;s not valid for the Chained, inasmuch if a row bigger than the dimension block is chained, it will remain chained also after an ALTER TABLE MOVE or SHRINK.


Is it correct my interpretation?

Thank you a lot.
Best Regards

Donatello Settembrino</description>
		<content:encoded><![CDATA[<p>Hi Tanel,<br />
Your interesting post has confirmed me a consideration that I did some time ago, or rather  to consider effectively costs and benefits.For the migrated rows it could think to do an ALTER TABEL T MOVE to allow at a migrate row to fit it in a single block. But, I think it&#8217;s not very easy, because after an ALTER TABLE..MOVE I should do REBUILD of the index, because if I don&#8217;t do it, the query it will not be able to use the index that remains in a unusable status. And if the indexes are more than one? The operation could start to become costly&#8230;</p>
<p>If I use ALTER TABLE..SHRINK SPACE I can bypass the indexes problem and reuse the space. But if my table, is a partitioned table with storical data and with several hundreds of millions of lines and I realize that there are migrated rows (and I have a performance problem) maybe I should isolate the problem at partition level and execute SHRINK on the single partition, provided that&#8217;s worth it.</p>
<p>Surely, this conversation it&#8217;s not valid for the Chained, inasmuch if a row bigger than the dimension block is chained, it will remain chained also after an ALTER TABLE MOVE or SHRINK.</p>
<p>Is it correct my interpretation?</p>
<p>Thank you a lot.<br />
Best Regards</p>
<p>Donatello Settembrino</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tanel Poder</title>
		<link>http://blog.tanelpoder.com/2009/11/04/detect-chained-and-migrated-rows-in-oracle/comment-page-1/#comment-3699</link>
		<dc:creator>Tanel Poder</dc:creator>
		<pubDate>Wed, 27 Jan 2010 18:23:15 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tanelpoder.com/?p=479#comment-3699</guid>
		<description>&lt;a href=&quot;#comment-3599&quot; rel=&quot;nofollow&quot;&gt;@Petr&lt;/a&gt; 
Yep, its possible to do correlation analysis - IF you have correlated fluctuation in LIOs per segment and system wide stats. I&#039;ve done something similar in past with other stats, but found it to be not reliable enough in systems with lots of diverse workloads, batch jobs running etc...</description>
		<content:encoded><![CDATA[<p><a href="#comment-3599" rel="nofollow">@Petr</a><br />
Yep, its possible to do correlation analysis &#8211; IF you have correlated fluctuation in LIOs per segment and system wide stats. I&#8217;ve done something similar in past with other stats, but found it to be not reliable enough in systems with lots of diverse workloads, batch jobs running etc&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Petr</title>
		<link>http://blog.tanelpoder.com/2009/11/04/detect-chained-and-migrated-rows-in-oracle/comment-page-1/#comment-3599</link>
		<dc:creator>Petr</dc:creator>
		<pubDate>Wed, 13 Jan 2010 10:29:25 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tanelpoder.com/?p=479#comment-3599</guid>
		<description>Hallo Tanel,

I suppose AWR/Statspack is good starting point to find out which read intensive segments have many chained rows (and are candidates for rebuild). I wrote AWR script which shows read intensive segments with high correlation between logical reads and  some system statistics (here it would be &#039;table fetch continued row&#039;) on some day(s). 

Best Regards,
Petr</description>
		<content:encoded><![CDATA[<p>Hallo Tanel,</p>
<p>I suppose AWR/Statspack is good starting point to find out which read intensive segments have many chained rows (and are candidates for rebuild). I wrote AWR script which shows read intensive segments with high correlation between logical reads and  some system statistics (here it would be &#8216;table fetch continued row&#8217;) on some day(s). </p>
<p>Best Regards,<br />
Petr</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tanel Poder</title>
		<link>http://blog.tanelpoder.com/2009/11/04/detect-chained-and-migrated-rows-in-oracle/comment-page-1/#comment-3292</link>
		<dc:creator>Tanel Poder</dc:creator>
		<pubDate>Sun, 06 Dec 2009 16:52:40 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tanelpoder.com/?p=479#comment-3292</guid>
		<description>Yes, that&#039;s exactly what ENABLE ROW MOVEMENT does - it allows also row headers move around. Normally row headers don&#039;t move around even if they migrate to other blocks, that way no index updates are needed when row migrates.</description>
		<content:encoded><![CDATA[<p>Yes, that&#8217;s exactly what ENABLE ROW MOVEMENT does &#8211; it allows also row headers move around. Normally row headers don&#8217;t move around even if they migrate to other blocks, that way no index updates are needed when row migrates.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ron van Zijl</title>
		<link>http://blog.tanelpoder.com/2009/11/04/detect-chained-and-migrated-rows-in-oracle/comment-page-1/#comment-3235</link>
		<dc:creator>Ron van Zijl</dc:creator>
		<pubDate>Thu, 03 Dec 2009 11:02:04 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tanelpoder.com/?p=479#comment-3235</guid>
		<description>Hey Tanel,

Very interesting article. Have you looked into the effects of having ROW MOVEMENT enabled on the table. Especially the 11g option to combine that with an ALTER TABLE SHRINK SPACE COMPACT may relocate the header to where the block actually is.</description>
		<content:encoded><![CDATA[<p>Hey Tanel,</p>
<p>Very interesting article. Have you looked into the effects of having ROW MOVEMENT enabled on the table. Especially the 11g option to combine that with an ALTER TABLE SHRINK SPACE COMPACT may relocate the header to where the block actually is.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Blogroll Report 30/10/2009-06/11/2009 &#171; Coskan&#8217;s Approach to Oracle</title>
		<link>http://blog.tanelpoder.com/2009/11/04/detect-chained-and-migrated-rows-in-oracle/comment-page-1/#comment-2952</link>
		<dc:creator>Blogroll Report 30/10/2009-06/11/2009 &#171; Coskan&#8217;s Approach to Oracle</dc:creator>
		<pubDate>Tue, 10 Nov 2009 18:14:47 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tanelpoder.com/?p=479#comment-2952</guid>
		<description>[...] Tanel Poder-Detect chained and migrated rows in Oracle Part 1 [...]</description>
		<content:encoded><![CDATA[<p>[...] Tanel Poder-Detect chained and migrated rows in Oracle Part 1 [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tanel Poder</title>
		<link>http://blog.tanelpoder.com/2009/11/04/detect-chained-and-migrated-rows-in-oracle/comment-page-1/#comment-2926</link>
		<dc:creator>Tanel Poder</dc:creator>
		<pubDate>Sat, 07 Nov 2009 23:13:08 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tanelpoder.com/?p=479#comment-2926</guid>
		<description>Thanks Uwe and Raj!</description>
		<content:encoded><![CDATA[<p>Thanks Uwe and Raj!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Raj</title>
		<link>http://blog.tanelpoder.com/2009/11/04/detect-chained-and-migrated-rows-in-oracle/comment-page-1/#comment-2919</link>
		<dc:creator>Raj</dc:creator>
		<pubDate>Sat, 07 Nov 2009 11:15:25 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tanelpoder.com/?p=479#comment-2919</guid>
		<description>Tanel

Thank you very much for this piece , especially method 2 and the ratio evaluation.

When I got this  issue for the first time a couple of days back , &quot;table fetch row continued&quot; stats in v$sesstat and &quot;db file sequential read&quot; in v$session_wait are the things
I got when the table was merging about 2 million rows by comparing on the PK.  Later on , I was able to confirm this by &#039;analyze table ...partition...list chained rows into
chained_rows&#039; and then I rebuilt the table.

So, it very much complies with your first method. Though I would admit the second method is very elegant and gives us better metrics.
However, when the issue is till on , it would be very nice to do a block dump on the blocks appearing in P2 parameter of &#039;db file sequential read&#039; waits and get the confirmation.
I just found a link to detect row-chaining via block dump [by Steve Adams]. Just wanted to share.
http://www.ixora.com.au/q+a/0107/27152941.htm

---Raj</description>
		<content:encoded><![CDATA[<p>Tanel</p>
<p>Thank you very much for this piece , especially method 2 and the ratio evaluation.</p>
<p>When I got this  issue for the first time a couple of days back , &#8220;table fetch row continued&#8221; stats in v$sesstat and &#8220;db file sequential read&#8221; in v$session_wait are the things<br />
I got when the table was merging about 2 million rows by comparing on the PK.  Later on , I was able to confirm this by &#8216;analyze table &#8230;partition&#8230;list chained rows into<br />
chained_rows&#8217; and then I rebuilt the table.</p>
<p>So, it very much complies with your first method. Though I would admit the second method is very elegant and gives us better metrics.<br />
However, when the issue is till on , it would be very nice to do a block dump on the blocks appearing in P2 parameter of &#8216;db file sequential read&#8217; waits and get the confirmation.<br />
I just found a link to detect row-chaining via block dump [by Steve Adams]. Just wanted to share.<br />
<a href="http://www.ixora.com.au/q+a/0107/27152941.htm" rel="nofollow">http://www.ixora.com.au/q+a/0107/27152941.htm</a></p>
<p>&#8212;Raj</p>
]]></content:encoded>
	</item>
</channel>
</rss>

