<?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; performance</title>
	<atom:link href="http://www.os2ora.com/tag/performance/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.os2ora.com</link>
	<description>专注于现实世界Oracle数据库的高性能，高可扩展性与新一代数据库Exadata架构</description>
	<lastBuildDate>Fri, 16 Jul 2010 02:55:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>connect by的性能分析</title>
		<link>http://www.os2ora.com/connect-by-performance-tunning/</link>
		<comments>http://www.os2ora.com/connect-by-performance-tunning/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 11:52:03 +0000</pubDate>
		<dc:creator>Kaya</dc:creator>
				<category><![CDATA[Oracle SQL 扩展]]></category>
		<category><![CDATA[数据库性能调优]]></category>
		<category><![CDATA[connect by]]></category>
		<category><![CDATA[distinct]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[tree]]></category>

		<guid isPermaLink="false">http://www.os2ora.com/connect-by-performance-tunning/</guid>
		<description><![CDATA[对上一篇文章里提到两条语句 
select distinct begin_date, end_date, begin_date + level -1 day  from test connect by begin_date + level -1 <= end_date order by 1,2,3; 
和 
select one_date 
  from (select start_date + level - 1 one_date 
          from (select min(start_date) start_date, max(end_date) end_date 
                  from test) test 
        connect by start_date + level - 1 < = end_date ) all_date, 
       test 
where one_date between start_date and end_date; 

它们都实现相同的功能，即: 当一个表里面有两个列，分别为begin_date和end_date时，如何针对这个表的每一行，用SQL返回begin_date和end_date之间的所有连续日期。 

这两条语句的可扩展性问题是下面是讨论的重点......]]></description>
			<content:encoded><![CDATA[<p>Kaya 发表于 <a href="http://www.os2ora.com">os2ora.com</a></p>
<p>对上一篇文章里提到两条语句<br />
select distinct begin_date, end_date, begin_date + level -1 day  from test connect by begin_date + level -1 &lt;= end_date order by 1,2,3;<br />
和<br />
select one_date<br />
  from (select start_date + level &#8211; 1 one_date<br />
          from (select min(start_date) start_date, max(end_date) end_date<br />
                  from test) test<br />
        connect by start_date + level &#8211; 1 &lt; = end_date ) all_date,<br />
       test<br />
where one_date between start_date and end_date;</p>
<p>它们都实现相同的功能，即: 当一个表里面有两个列，分别为begin_date和end_date时，如何针对这个表的每一行，用SQL返回begin_date和end_date之间的所有连续日期。</p>
<p>首先，我们关注第一条语句在没有distinct的情况下返回的行数。</p>
<p>会使问题简单化，假设对于表里的每行数据，end_date &#8211; begin_date + 1 的值都是一样的，设为 n 。假设test里总共有 m 行(m&gt;1)。<br />
那么，这时返回的行数是 m * ( power(m,n) &#8211; 1 )/( m &#8211; 1 ) 。<br />
(<br />
这是一个等比数列，公式为<br />
1 +  m +  power(m,2) + &#8230;.  power(m,n-1) = ( 1 &#8211; power (m,n)) / (1 &#8211; m),<br />
)<br />
这些行可以用一系列的树加以形象的表示，如下所示：</p>
<p><a href="http://www.os2ora.com/wp-content/uploads/2009/03/connectby.jpg"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="connectby" src="http://www.os2ora.com/wp-content/uploads/2009/03/connectby-thumb.jpg" border="0" alt="connectby" width="627" height="181" /></a></p>
<p>当 n 和 m 很大时，会使结果集变得非常之大，为 power(m,n).</p>
<p>因此，下面语句在数据量变大的情况下，性能将急剧下降!<br />
select distinct begin_date, end_date, begin_date + level -1 day  from test connect by begin_date + level -1 &lt;= end_date order by 1,2,3;</p>
<p>对于语句2，我们关注以下子查询所返回的行数:<br />
select start_date + level &#8211; 1 one_date<br />
          from (select min(start_date) start_date, max(end_date) end_date<br />
                  from test) test<br />
        connect by start_date + level &#8211; 1 &lt; = end_date</p>
<p>这时，表实质上只有1行时，存贮的是原来表的最大值和最小值。也就是说，这时 m = 1 。</p>
<p>当m=1时，情况变得不同了。这时，返回的行数刚好就是 n 。<br />
如果以树加以表示的话，这时上面的图形已经退化成一棵只有一个支干的树。</p>
<p><a href="http://www.os2ora.com/wp-content/uploads/2009/03/image4.png"><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="image" src="http://www.os2ora.com/wp-content/uploads/2009/03/image-thumb4.png" border="0" alt="image" width="251" height="184" /></a></p>
<p>因此，当原来的查询m 和 n都很大时，返回的行数为 将为n。</p>
<p>从上面的表述可清晰地看出，语句2在大数据量的情形下将能体现出良好的性能。</p>
<p>从另一方面看，出现distinct的地方，或许就是性能调整应该关注的地方了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.os2ora.com/connect-by-performance-tunning/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
