<?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; parallel</title>
	<atom:link href="http://www.os2ora.com/tag/parallel/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>史上最快，最具可扩展性的文本导入方法 &#8211;大数据量加载最佳实践</title>
		<link>http://www.os2ora.com/the-fastest-data-load-method-best-practice/</link>
		<comments>http://www.os2ora.com/the-fastest-data-load-method-best-practice/#comments</comments>
		<pubDate>Sat, 01 May 2010 16:06:22 +0000</pubDate>
		<dc:creator>Kaya</dc:creator>
				<category><![CDATA[Exadata]]></category>
		<category><![CDATA[数据库性能调优]]></category>
		<category><![CDATA[data pump]]></category>
		<category><![CDATA[external table]]></category>
		<category><![CDATA[load]]></category>
		<category><![CDATA[parallel]]></category>
		<category><![CDATA[RAC]]></category>
		<category><![CDATA[sqlldr]]></category>

		<guid isPermaLink="false">http://www.os2ora.com/the-fastest-data-load-method-best-practice/</guid>
		<description><![CDATA[竟然写了史上最快，最具可扩展性的文本导出方法, 模仿上一篇的语调，再写个史上最快，最具可扩展性的文本导入方法应该也是挺有趣的一件事情，试试吧，这或许能意想不到地从另一个角度阐述大数据量文本导入的特点，与大数据量文本导出的共性，与大数据量文本导出的不同，Oracle并行技术的运用。
不过，从另一方面讲，大数据量加载应该是一个比较成熟的技术，厚道一点，还是再用一个副标题吧：大数据量加载最佳实践。OK，开始模仿作文......]]></description>
			<content:encoded><![CDATA[<p>Kaya 发表于 <a href="http://www.os2ora.com/">os2ora.com</a></p>
<p>竟然写了<a href="http://www.os2ora.com/the-fastest-data-unload-method/">史上最快，最具可扩展性的文本导出方法</a>, 模仿上一篇的语调，再写个<strong>史上最快，最具可扩展性的文本导入方法</strong>应该也是挺有趣的一件事情，试试吧，这或许能意想不到地从另一个角度阐述大数据量文本导入的特点，与大数据量文本导出的共性，与大数据量文本导出的不同，Oracle并行技术的运用。</p>
<p>不过，从另一方面讲，大数据量加载应该是一个比较成熟的技术，厚道一点，还是再用一个副标题吧：大数据量加载最佳实践。OK，开始模仿作文：</p>
<p>这个题目有点吓人，不过既然这么说，当然有其强有力的后台做支撑。如果说一句谎言必须用更多的谎言来圆的话，一句真话恐怕也要用更多的真话来阐述，呵呵，且让我慢慢道来。</p>
<p>Oracle上的技术，其实是相当开放的，这里提到的这种文本导入方法，其实在官方文档中已经做了很好的论述和说明。只不过本着独乐乐不如众乐乐的想法，在这里再推广一把罢了。</p>
<p>首先明确一点，文本导入到数据库中，或者把数据从数据库中导出为文本格式，这都是极其消耗CPU的操作。所以，对于一个配置均衡的系统而言，导出速度首先取决于系统CPU的运算能力。基于大数据量处理的系统一般都是多节点的RAC系统，于是，文本导入的一个主要议题就是：如何利用起所有RAC节点的所有CPU的运算能力。</p>
<p>Oracle的Data Pump其实就达到了这个目标，在RAC系统中运行Data Pump，通过设置parallel参数，导入作业会在所有RAC节点运行，从而利用起系统可能存在的空闲的CPU资源。不过，Data Pump没有提供导入文本文件的方法。</p>
<p>如果自己实现这种并行机制呢？那也未尝不可，SQL*Loader是Oracle的一个导入文本文件工具，叫做<a href="http://download.oracle.com/docs/cd/E11882_01/server.112/e10701/ldr_concepts.htm">sqlldr</a>，这是一个单进程的工具，不过我们可以在系统中启动多个sqlldr实例，通过指定不同的实例加载不同的文本文件，从而实现并行加载。这里有几点说明一下：</p>
<ul>
<li>通过把一个表的数据分割成多个文件，可以实现对一个表的并行加载 </li>
<li>通过在RAC的多个节点上启动多个sqlldr，可以实现跨节点的并行加载 </li>
<li>必须加上parallel=true参数，在每个sqlldr 的参数文件中。 </li>
</ul>
<p>这个方法显而易见的有两个缺点</p>
<ul>
<li>必须用户自己协调多个sqlldr的运行 </li>
<li>如果只有一个数据文件，无法利用多个sqlldr实现并行加载 </li>
</ul>
<p>如果能利用起Oracle本身的并行机制，那应该是一件高效并且简单的实现。只要想想Oracle投入了多少人力开发设计并行这个技术，想想并行技术在Oracle版本中的悠久历史，我们会毫不怀疑地相信并行技术的高效性，可扩展性与稳定性。</p>
<p>并行技术的首要设计目标就是把所有可能空闲的系统资源利用起来。例如对于下面一个简单的查询</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> big_table</pre></div></div>

<p>如果现在的系统有8个节点，每个节点有8个CPU，那么这时Oracle会启动8*8*parallel_threads_per_cpu =128个并行进程。每个进程负责扫描表big_table的1/128了。与串行执行相比，扫描时间理论上会缩小为1/128，“理论上”背后主要的潜台词就是系统没有IO瓶颈了。</p>
<p>设想一下，如果这128个进程在扫描表的同时，把这些数据同时写到目标表中，这不就是我们所想要的并行文本导入功能吗？关键是找到一个途径，告诉这些并行进程在扫描的时候去扫描文本文件，而不是一个实实在在的内部表。</p>
<p>这个途径，Oracle中以External Table的形式提供。这是把文本文件映射成Table的一种技术。利用这种技术，我们可以实现把对文本文件的读取操作，转换为对数据表的select操作。</p>
<p>上面提到的就是利用Oracle本身的并行机制实现并行多节点导入数据的主要思路。至于具体的实现，可以直接参考官方文档<a href="http://download.oracle.com/et_params.htm#i1012274">The ORACLE_LOADER Access Driver</a>，这一章详细解释了外部表的定义与使用。具体的例子可以参考<a href="http://download.oracle.com/#CIHCHGCE">Example: Creating and Loading an External Table Using ORACLE_LOADER</a>。</p>
<p>我们再深入一步，到目前为止，我们应该能够穷尽整个RAC系统所有节点的CPU处理能力，仅仅是“应该”而已。想像一种情况，如果导入文件系统的IO性能很差，不能足够快地提供上面提到的128个并行进程的读取操作，那么瓶颈就会出现在磁盘IO上了。按照我们的经验，128个进程甚至可以提供接近4GB/s的加载速度。要找到一个文件服务器提供这么高的带宽对于很多数据中心而言还是不现实的。</p>
<p>解决方法在于减少对磁盘的IO量，一个马上想到的方法就是对并行进程读出的数据进行压缩。11g中，外部表定义引入了一个新的特性，叫做PREPROCESSOR，它可以实现对外部文件的预先处理，再把处理后得到的数据传送给Oracle内部进行加载。利用这个特性，我们可以实现对压缩文本文件的加载。具体而言，下面是官方文档中提到的一个例子：</p>
<p>Example 14-1 Specifying the PREPROCESSOR Clause</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">SQL&amp;gt; <span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> xtab <span style="color: #66cc66;">&#40;</span>recno varchar2<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2000</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #cc66cc;">2</span>    ORGANIZATION EXTERNAL <span style="color: #66cc66;">&#40;</span>
     <span style="color: #cc66cc;">3</span>    TYPE ORACLE_LOADER
     <span style="color: #cc66cc;">4</span>    <span style="color: #993333; font-weight: bold;">DEFAULT</span> DIRECTORY data_dir
     <span style="color: #cc66cc;">5</span>    ACCESS PARAMETERS <span style="color: #66cc66;">&#40;</span>
     <span style="color: #cc66cc;">6</span>    RECORDS DELIMITED <span style="color: #993333; font-weight: bold;">BY</span> NEWLINE
     <span style="color: #cc66cc;">7</span>    PREPROCESSOR execdir:<span style="color: #ff0000;">'zcat'</span>
     <span style="color: #cc66cc;">8</span>    <span style="color: #993333; font-weight: bold;">FIELDS</span> <span style="color: #66cc66;">&#40;</span>recno char<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2000</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #cc66cc;">9</span>    LOCATION <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'foo.dat.gz'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
   <span style="color: #cc66cc;">10</span>    REJECT <span style="color: #993333; font-weight: bold;">LIMIT</span> UNLIMITED;
<span style="color: #993333; font-weight: bold;">TABLE</span> created<span style="color: #66cc66;">.</span></pre></div></div>

<p>假设gzip的压缩率为1:10，于是我们实现了把4GB/s的读取速度下降到400MB/s，另一方面，由于解压缩需要消耗一定的CPU，我们实现了用CPU换取IO的曲线救国。</p>
<p>&#160;</p>
<p>可以看出，文本导入与文本导出其实存在着很多共性。实现高性能导入/导出的原则是一样的：</p>
<ul>
<li>充分利用起系统中的CPU与IO资源，直至其中一方成为瓶颈 </li>
<li>利用压缩技术消除可能存在的IO瓶颈 </li>
</ul>
<p>另一方面，关于并行技术，它不仅包括大家喜闻乐见的并行Query，并行DML；并行import，并行export其实也是并行技术用于数据仓库场合的重要方面。并行import和并行export，我想会在企业中的ODS系统中发挥重要作用。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.os2ora.com/the-fastest-data-load-method-best-practice/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>史上最快，最具可扩展性的文本导出方法</title>
		<link>http://www.os2ora.com/the-fastest-data-unload-method/</link>
		<comments>http://www.os2ora.com/the-fastest-data-unload-method/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 08:59:59 +0000</pubDate>
		<dc:creator>Kaya</dc:creator>
				<category><![CDATA[Exadata]]></category>
		<category><![CDATA[Linux性能调优]]></category>
		<category><![CDATA[数据库性能调优]]></category>
		<category><![CDATA[degree]]></category>
		<category><![CDATA[parallel]]></category>
		<category><![CDATA[pipelined table function]]></category>
		<category><![CDATA[RAC]]></category>
		<category><![CDATA[unload]]></category>

		<guid isPermaLink="false">http://www.os2ora.com/the-fastest-data-unload-method/</guid>
		<description><![CDATA[这个题目有点吓人，不过既然这么说，当然有其强有力的后台做支撑。如果说一句谎言必须用更多的谎言来圆的话，一句真话恐怕也要用更多的真话来阐述，呵呵，且让我慢慢道来。

Oracle上的技术，其实是相当开放的，这里提到的这种文本导出方法，其实在网上已经有人做了很好的论述和实现。只不过本着独乐乐不如众乐乐的想法，在这里再推广一把罢了。

首先明确一点，文本导入到数据库中，或者把数据从数据库中导出为文本格式，这都是极其消耗CPU的操作。所以，导出速度首先取决于系统CPU的运算能力。基于大数据量处理的系统一般都是多节点的RAC系统，于是，文本导出的一个主要议题就是：如何利用起所有RAC节点的所有CPU的运算能力......]]></description>
			<content:encoded><![CDATA[<p>Kaya 发表于 <a href="http://www.os2ora.com/">os2ora.com</a></p>
<p>这个题目有点吓人，不过既然这么说，当然有其强有力的后台做支撑。如果说一句谎言必须用更多的谎言来圆的话，一句真话恐怕也要用更多的真话来阐述，呵呵，且让我慢慢道来。</p>
<p>Oracle上的技术，其实是相当开放的，这里提到的这种文本导出方法，其实在网上已经有人做了很好的论述和实现。只不过本着独乐乐不如众乐乐的想法，在这里再推广一把罢了。</p>
<p>首先明确一点，文本导入到数据库中，或者把数据从数据库中导出为文本格式，这都是极其消耗CPU的操作。所以，导出速度首先取决于系统CPU的运算能力。基于大数据量处理的系统一般都是多节点的RAC系统，于是，文本导出的一个主要议题就是：如何利用起所有RAC节点的所有CPU的运算能力。</p>
<p>Oracle的Data Pump其实就达到了这个目标，在RAC系统中运行Data Pump，通过设置parallel参数，导出作业会在所有RAC节点运行，从而利用起系统可能存在的空闲的CPU资源。不过，Data Pump没有提供导出为文本格式的方法。</p>
<p>如果自己实现这种并行机制呢？那也未尝不可，目前anysql.net上有个类似的工具，叫做<a href="http://www.anysql.net/tools/parallel-inside-sqluldr2.html">sqluldr2</a>，应该就是朝着这个方向在发展。目前作者实现了对海量大表进行自动切片的算法，我想可能下一步的动作应该是在所有的RAC节点上启动多个sqluldr2实例进行导出，衷心希望这个工具能达到更好的性能。</p>
<p>如果能利用起Oracle本身的并行机制，那应该是一件高效并且简单的实现。只要想想Oracle投入了多少人力开发设计并行这个技术，想想并行技术在Oracle版本中的悠久历史，我们会毫不怀疑地相信并行技术的高效性，可扩展性与稳定性。</p>
<p>并行技术的首要设计目标就是把所有可能空闲的系统资源利用起来。例如对于下面一个简单的查询</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> big_table</pre></div></div>

<p>如果现在的系统有8个节点，每个节点有8个CPU，那么这时Oracle会启动8*8*parallel_threads_per_cpu =128个并行进程。每个进程负责扫描表big_table的1/128了。与串行执行相比，扫描时间理论上会缩小为1/128，“理论上”背后主要的潜台词就是系统没有IO瓶颈了。</p>
<p>设想一下，如果这128个进程在扫描表的同时，把这些数据同时写到文本文件中，这不就是我们所想要的并行文本导出功能吗？关键是找到一个途径，告诉这些并行进程在扫描的同时执行写出数据到文本中这个操作。</p>
<p>这个途径，Oracle中以pipelined table function的形式提供。这是一个PL/SQL函数，我们只要在这个函数里面把每个并行进程接收到的数据通过UTL_FILE.PUT函数写到文本中就达到了我们的目标了。</p>
<p>上面提到的是利用Oracle本身的并行机制实现并行多节点导出数据的主要思路。至于具体的实现，可以直接参考<a href="http://www.oracle-developer.net">www.oracle-developer.net</a>上的文章：<a href="http://www.oracle-developer.net/display.php?id=429">improving performance with pipelined table functions</a>，这篇文章详细解释了pipelined table functions在数据导入和转换（ETL），数据导出方面的杰出贡献，具体地说，数据导出部分的子标题是asynchronous data unloading with parallel pipelined functions。同时，文章提到的脚本应该是能直接下载和运行的。</p>
<p>我们再深入一步，到目前为止，我们应该能够穷尽整个RAC系统所有节点的CPU处理能力，仅仅是“应该”而已。想像一种情况，如果导出文件系统的IO性能很差，不能足够快地消化上面提到的128个并行进程的写入操作，那么瓶颈就会出现在磁盘IO上了。按照我们的经验，128个进程提供接近1GB每秒的写出量还是有可能了。要找到一个文件服务器提供这么高的带宽对于很多数据中心而言还是不现实的。</p>
<p>解决方法在于减少对磁盘的IO量，一个马上想到的方法就是对并行进程写出的数据进行压缩。然后再把压缩后的数据写往磁盘。在Unix系统中，这可能通过文件管道的形式实现：并行进程把数据写入管道文件中，gzip进程通过读取管道文件，对数据进行压缩，然后再把它写入到目标磁盘中。</p>
<p>假设gzip的压缩率为1:10，于是我们实现了把1GB/s的写入下降到100MB/s，这是一个大部分文件服务器能达到的指标了。同时，我们在导出的同时做了后面我们很可能做的事情，压缩数据以便于减少数据空间或者以利于网络传输。</p>
<p>不知道上面的论述能否对得起这篇文章的标题 <img src='http://www.os2ora.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.os2ora.com/the-fastest-data-unload-method/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>11gR2出色的SQL Monitor Report</title>
		<link>http://www.os2ora.com/fantastic-11gr2-sql-monitor-report/</link>
		<comments>http://www.os2ora.com/fantastic-11gr2-sql-monitor-report/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 14:20:28 +0000</pubDate>
		<dc:creator>Kaya</dc:creator>
				<category><![CDATA[数据库性能调优]]></category>
		<category><![CDATA[11gR2]]></category>
		<category><![CDATA[active session]]></category>
		<category><![CDATA[gather_plan_statistics]]></category>
		<category><![CDATA[parallel]]></category>
		<category><![CDATA[SQL Monitor Report]]></category>
		<category><![CDATA[新特性]]></category>

		<guid isPermaLink="false">http://www.os2ora.com/fantastic-11gr2-sql-monitor-report/</guid>
		<description><![CDATA[SQL Monitor Report是11g推出的一个新特性。如果说11gR1里的SQL Monitor Report已经达到可圈可点的程度，那么11gR2里的SQL Monitor Report可以说已经接近完美了。

这个SQL Monitor Report包含的信息比单纯的Execution Plan可全面多了，基本上，有了这份报告之后，troubleshooting所需要的大部分信息都已经具备了。

这个Report主要包括以下五部分......]]></description>
			<content:encoded><![CDATA[<p>Kaya 发表于 <a href="http://www.os2ora.com/">os2ora.com</a>&#160;</p>
<p>SQL Monitor Report是11g推出的一个新特性。如果说11gR1里的SQL Monitor Report已经达到可圈可点的程度，那么11gR2里的SQL Monitor Report可以说已经接近完美了。</p>
<p>这个SQL Monitor Report包含的信息比单纯的Execution Plan可全面多了，基本上，有了这份报告之后，troubleshooting所需要的大部分信息都已经具备了。</p>
<p><a href="http://www.oracle.com/technology/products/manageability/database/active_reports/samples/faq_ctas.html">这个Report</a>主要包括以下五部分:</p>
<p>1. 执行计划，包括SQL执行时年actual rows，我们一般根据它与estimate rows的吻合程度判断一个执行计划的正确与否。在10g的时候，一般可以通过hint gather_plan_statistics来让执行计划显示actural rows，而在11g中，不用相关的hint，SQL Monitor Report就能显示这部分信息了。</p>
<p><a href="http://www.os2ora.com/wp-content/uploads/2010/01/image3.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="383" alt="image" src="http://www.os2ora.com/wp-content/uploads/2010/01/image_thumb3.png" width="664" border="0" /></a> </p>
<p>2. 还是执行计划，不过没有详细的statistics，但是提供了以图形方式进行执行计划的展示。</p>
<p><a href="http://www.os2ora.com/wp-content/uploads/2010/01/image4.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="374" alt="image" src="http://www.os2ora.com/wp-content/uploads/2010/01/image_thumb4.png" width="664" border="0" /></a> </p>
<p>3. 并行进程在各个节点上的分布情况，还有每个slave进程的资源消耗情况(DB Time, wait events, physical IO, logical IO etc.)</p>
<p><a href="http://www.os2ora.com/wp-content/uploads/2010/01/image5.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="379" alt="image" src="http://www.os2ora.com/wp-content/uploads/2010/01/image_thumb5.png" width="664" border="0" /></a> </p>
<p>4. SQL对应的数据库活动情况，从这里可以看到SQL的负载特征，如在这里，这条SQL是典型的CPU密集型的SQL。</p>
</p>
<p><a href="http://www.os2ora.com/wp-content/uploads/2010/01/image6.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="385" alt="image" src="http://www.os2ora.com/wp-content/uploads/2010/01/image_thumb6.png" width="664" border="0" /></a> </p>
<p>5. 系统资源利用情况曲线图，包括CPU, IOPS, MBPS, PGA Usage, Temp Usage etc.</p>
<p><a href="http://www.os2ora.com/wp-content/uploads/2010/01/image7.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="386" alt="image" src="http://www.os2ora.com/wp-content/uploads/2010/01/image_thumb7.png" width="664" border="0" /></a> </p>
</p>
</p>
<p>可以想像，这个工具将能大幅度提高DBA的工作效率，对于离线分析SQL的执行性能带来了极大的方便。</p>
<p>一个最常提到的问题当然是如何去获取这一份Report，除了通过EM的界面去访问之外，我更趋向于用命令行的方式，这时，有两种选择</p>
<p>1. 如果想在一个SQL执行完之后马上生成SQL Monitor Report，可以简单地调用下面的脚本</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SET</span> linesize <span style="color: #cc66cc;">300</span>
<span style="color: #993333; font-weight: bold;">SET</span> pages <span style="color: #cc66cc;">50000</span>
<span style="color: #993333; font-weight: bold;">SET</span> long <span style="color: #cc66cc;">200000000</span>
<span style="color: #993333; font-weight: bold;">SET</span> longchunksize <span style="color: #cc66cc;">20000000</span>
<span style="color: #993333; font-weight: bold;">SET</span> heading off
<span style="color: #993333; font-weight: bold;">SET</span> termout off
<span style="color: #993333; font-weight: bold;">SET</span> timing off
<span style="color: #993333; font-weight: bold;">SET</span> time off
<span style="color: #993333; font-weight: bold;">SET</span> echo off
<span style="color: #993333; font-weight: bold;">SET</span> verify off
&nbsp;
define f<span style="color: #66cc66;">=</span>&amp;amp;<span style="color: #cc66cc;">1</span>
spool &amp;amp;f<span style="color: #66cc66;">..</span>html
&nbsp;
<span style="color: #993333; font-weight: bold;">SELECT</span>
DBMS_SQLTUNE<span style="color: #66cc66;">.</span>REPORT_SQL_MONITOR<span style="color: #66cc66;">&#40;</span>
session_id<span style="color: #66cc66;">=&gt;</span>sys_context<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'userenv'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'sid'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
report_level<span style="color: #66cc66;">=&gt;</span><span style="color: #ff0000;">'ALL'</span><span style="color: #66cc66;">,</span>
type<span style="color: #66cc66;">=&gt;</span><span style="color: #ff0000;">'active'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> report
<span style="color: #993333; font-weight: bold;">FROM</span> dual;
&nbsp;
spool off</pre></div></div>

<p>&#160;</p>
<p>2. 如果想在SQL执行过程中或执行结束后在另一个session捕捉SQL Monitor Report，首先必须得到这个SQL的sql_id，然后就可以利用下面的脚本进行调用了。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SET</span> linesize <span style="color: #cc66cc;">300</span>
<span style="color: #993333; font-weight: bold;">SET</span> pages <span style="color: #cc66cc;">50000</span>
<span style="color: #993333; font-weight: bold;">SET</span> long <span style="color: #cc66cc;">200000000</span>
<span style="color: #993333; font-weight: bold;">SET</span> longchunksize <span style="color: #cc66cc;">20000000</span>
<span style="color: #993333; font-weight: bold;">SET</span> heading off
<span style="color: #993333; font-weight: bold;">SET</span> termout off
<span style="color: #993333; font-weight: bold;">SET</span> timing off
<span style="color: #993333; font-weight: bold;">SET</span> time off
<span style="color: #993333; font-weight: bold;">SET</span> echo off
<span style="color: #993333; font-weight: bold;">SET</span> verify off
&nbsp;
<span style="color: #993333; font-weight: bold;">SELECT</span>
DBMS_SQLTUNE<span style="color: #66cc66;">.</span>REPORT_SQL_MONITOR<span style="color: #66cc66;">&#40;</span>
sql_id<span style="color: #66cc66;">=&gt;</span><span style="color: #ff0000;">'&amp;sql_id.'</span><span style="color: #66cc66;">,</span>
report_level<span style="color: #66cc66;">=&gt;</span><span style="color: #ff0000;">'ALL'</span><span style="color: #66cc66;">,</span>
type<span style="color: #66cc66;">=&gt;</span><span style="color: #ff0000;">'active'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> report
<span style="color: #993333; font-weight: bold;">FROM</span> dual;</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.os2ora.com/fantastic-11gr2-sql-monitor-report/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何决定Hash Partitions的数目</title>
		<link>http://www.os2ora.com/how-to-decide-the-number-of-hash-partitions/</link>
		<comments>http://www.os2ora.com/how-to-decide-the-number-of-hash-partitions/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 13:14:57 +0000</pubDate>
		<dc:creator>Kaya</dc:creator>
				<category><![CDATA[数据库性能调优]]></category>
		<category><![CDATA[DOP]]></category>
		<category><![CDATA[hash partitioning]]></category>
		<category><![CDATA[parallel]]></category>
		<category><![CDATA[partition-wise join]]></category>

		<guid isPermaLink="false">http://www.os2ora.com/%e5%a6%82%e4%bd%95%e5%86%b3%e5%ae%9ahash-partitions%e7%9a%84%e6%95%b0%e7%9b%ae/</guid>
		<description><![CDATA[Oracle也广泛地使用着Hash算法，Hash Partitioning就是在数据仓库应用中的一个典型例子。Hash Partitioning的一个最大的优势就是实现partition wise join.一个要考虑的问题在于hash partitions数目的选择，一个总的原则是它应该是2的乘方，如4,8,16,32,64,128…另一个要考虑的方面在于硬件的处理能力，对了，就是RAC里面的节点数，还有每个节点CPU Cores的多少。说得再具体一点，就是默认的DOP的大小(默认DOP = 2 * cpu_count * number of nodes in the cluster)。一般而言，把hash partitions的个数设置成默认的DOP是一个推荐的设置值......]]></description>
			<content:encoded><![CDATA[<p>Kaya 发表于 <a href="http://www.os2ora.com">os2ora.com</a></p>
<p>Hash也许是计算机科学里的一个重大发明，简单地说，Hash函数实现把一个值映射到相应的buckets里。而Hash函数也在数据仓库领域发挥着举足轻重的作用。</p>
<p>Teradata，一个专注于数据仓库应用的数据库。把并行发挥到极致，它的哲学就在于把任何一个操作都并行化。而并行的基础就在于对数据的Hash分布，通过Hash，实现数据的均匀分布，从而使得并行处理的各个进程能够分担大约相等的任务。</p>
<p>同样地，Oracle也广泛地使用着Hash算法，Hash Partitioning就是在数据仓库应用中的一个典型例子。Hash Partitioning的一个最大的优势就是实现partition wise join.</p>
<p>一个要考虑的问题在于hash partitions数目的选择，一个总的原则是它应该是2的乘方，如4,8,16,32,64,128…</p>
<p>另一个要考虑的方面在于硬件的处理能力，对了，就是RAC里面的节点数，还有每个节点CPU Cores的多少。说得再具体一点，就是默认的DOP的大小(默认DOP = 2 * cpu_count * number of nodes in the cluster)。一般而言，把hash partitions的个数设置成默认的DOP是一个推荐的设置值。在这种问题下，CBO一般会找到最好的执行计划，如利用partition-wise join的特性。</p>
<p>下面的执行计划是一个示例，这是一个利用了parition-wise join的例子。这里，DOP的大小等于hash partitions的个数。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">---------------------------------------------------------------------------------------------------------------------------------</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">SELECT</span> STATEMENT        <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   976K<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">128</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:02 <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>        <span style="color: #66cc66;">|</span>      <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>  PX COORDINATOR         <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>        <span style="color: #66cc66;">|</span>      <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>   PX SEND QC <span style="color: #66cc66;">&#40;</span>RANDOM<span style="color: #66cc66;">&#41;</span>   <span style="color: #66cc66;">|</span> :TQ10000 <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   976K<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">128</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:02 <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>00 <span style="color: #66cc66;">|</span> P<span style="color: #66cc66;">-</span>&amp;gt;S <span style="color: #66cc66;">|</span> QC <span style="color: #66cc66;">&#40;</span>RAND<span style="color: #66cc66;">&#41;</span>  <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    PX PARTITION HASH <span style="color: #993333; font-weight: bold;">ALL</span><span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   976K<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">128</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:02 <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>00 <span style="color: #66cc66;">|</span> PCWC <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|*</span>  <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>     HASH <span style="color: #993333; font-weight: bold;">JOIN</span>           <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   976K<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">128</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:02 <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>00 <span style="color: #66cc66;">|</span> PCWP <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>      <span style="color: #993333; font-weight: bold;">TABLE</span> ACCESS <span style="color: #993333; font-weight: bold;">FULL</span>  <span style="color: #66cc66;">|</span> FACT_B   <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   488K<span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">12</span>   <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">9</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:01 <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>00 <span style="color: #66cc66;">|</span> PCWP <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">6</span> <span style="color: #66cc66;">|</span>      <span style="color: #993333; font-weight: bold;">TABLE</span> ACCESS <span style="color: #993333; font-weight: bold;">FULL</span>  <span style="color: #66cc66;">|</span> FACT_A   <span style="color: #66cc66;">|</span>   995K<span style="color: #66cc66;">|</span>  4860K<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">112</span>   <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">7</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:02 <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>00 <span style="color: #66cc66;">|</span> PCWP <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #808080; font-style: italic;">---------------------------------------------------------------------------------------------------------------------------------</span>
Predicate Information <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">IDENTIFIED</span> <span style="color: #993333; font-weight: bold;">BY</span> operation id<span style="color: #66cc66;">&#41;</span>:
<span style="color: #808080; font-style: italic;">---------------------------------------------------</span>
   <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">-</span> access<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;A&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;PART_COL1&quot;</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;B&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;PART_COL1&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>如果hash partitions的个数比DOP还小，可能会出现下面的执行计划:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">-------------------------------------------------------------------------------------------------------------------------------------</span>
<span style="color: #66cc66;">|</span> Id  <span style="color: #66cc66;">|</span> Operation                   <span style="color: #66cc66;">|</span> Name     <span style="color: #66cc66;">|</span> Rows  <span style="color: #66cc66;">|</span> Bytes <span style="color: #66cc66;">|</span> Cost <span style="color: #66cc66;">&#40;</span>%CPU<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> Time     <span style="color: #66cc66;">|</span> Pstart<span style="color: #66cc66;">|</span> Pstop <span style="color: #66cc66;">|</span>    TQ  <span style="color: #66cc66;">|</span>IN<span style="color: #66cc66;">-</span>OUT<span style="color: #66cc66;">|</span> PQ Distrib <span style="color: #66cc66;">|</span>
<span style="color: #808080; font-style: italic;">-------------------------------------------------------------------------------------------------------------------------------------</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">SELECT</span> STATEMENT            <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   976K<span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">64</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:01 <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>        <span style="color: #66cc66;">|</span>      <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>  PX COORDINATOR             <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>        <span style="color: #66cc66;">|</span>      <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>   PX SEND QC <span style="color: #66cc66;">&#40;</span>RANDOM<span style="color: #66cc66;">&#41;</span>       <span style="color: #66cc66;">|</span> :TQ10001 <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   976K<span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">64</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:01 <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>01 <span style="color: #66cc66;">|</span> P<span style="color: #66cc66;">-</span>&amp;gt;S <span style="color: #66cc66;">|</span> QC <span style="color: #66cc66;">&#40;</span>RAND<span style="color: #66cc66;">&#41;</span>  <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|*</span>  <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    HASH <span style="color: #993333; font-weight: bold;">JOIN</span>                <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   976K<span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">64</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:01 <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>01 <span style="color: #66cc66;">|</span> PCWP <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>     PX RECEIVE              <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   488K<span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">6</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">17</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:01 <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>01 <span style="color: #66cc66;">|</span> PCWP <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>      PX SEND BROADCAST <span style="color: #993333; font-weight: bold;">LOCAL</span><span style="color: #66cc66;">|</span> :TQ10000 <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   488K<span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">6</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">17</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:01 <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>00 <span style="color: #66cc66;">|</span> P<span style="color: #66cc66;">-</span>&amp;gt;P <span style="color: #66cc66;">|</span> BCST <span style="color: #993333; font-weight: bold;">LOCAL</span> <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">6</span> <span style="color: #66cc66;">|</span>       PX BLOCK ITERATOR     <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   488K<span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">6</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">17</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:01 <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>00 <span style="color: #66cc66;">|</span> PCWC <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">7</span> <span style="color: #66cc66;">|</span>        <span style="color: #993333; font-weight: bold;">TABLE</span> ACCESS <span style="color: #993333; font-weight: bold;">FULL</span>    <span style="color: #66cc66;">|</span> FACT_B   <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   488K<span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">6</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">17</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:01 <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>00 <span style="color: #66cc66;">|</span> PCWP <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">|</span>     PX BLOCK ITERATOR       <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span>   995K<span style="color: #66cc66;">|</span>  4860K<span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">56</span>   <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:01 <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>01 <span style="color: #66cc66;">|</span> PCWC <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">|</span>      <span style="color: #993333; font-weight: bold;">TABLE</span> ACCESS <span style="color: #993333; font-weight: bold;">FULL</span>      <span style="color: #66cc66;">|</span> FACT_A   <span style="color: #66cc66;">|</span>   995K<span style="color: #66cc66;">|</span>  4860K<span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">56</span>   <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:01 <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>01 <span style="color: #66cc66;">|</span> PCWP <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #808080; font-style: italic;">-------------------------------------------------------------------------------------------------------------------------------------</span>
Predicate Information <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">IDENTIFIED</span> <span style="color: #993333; font-weight: bold;">BY</span> operation id<span style="color: #66cc66;">&#41;</span>:
<span style="color: #808080; font-style: italic;">---------------------------------------------------</span>
   <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">-</span> access<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;A&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;PART_COL1&quot;</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;B&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;PART_COL1&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>如果hash partitions的个数比DOP还大，可能会出现下面的执行计划:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">--------------------------------------------------------------------------------------------------------------------------------------</span>
<span style="color: #66cc66;">|</span> Id  <span style="color: #66cc66;">|</span> Operation                    <span style="color: #66cc66;">|</span> Name     <span style="color: #66cc66;">|</span> Rows  <span style="color: #66cc66;">|</span> Bytes <span style="color: #66cc66;">|</span> Cost <span style="color: #66cc66;">&#40;</span>%CPU<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> Time     <span style="color: #66cc66;">|</span> Pstart<span style="color: #66cc66;">|</span> Pstop <span style="color: #66cc66;">|</span>    TQ  <span style="color: #66cc66;">|</span>IN<span style="color: #66cc66;">-</span>OUT<span style="color: #66cc66;">|</span> PQ Distrib <span style="color: #66cc66;">|</span>
<span style="color: #808080; font-style: italic;">--------------------------------------------------------------------------------------------------------------------------------------</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">SELECT</span> STATEMENT             <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   976K<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">256</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:04 <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>        <span style="color: #66cc66;">|</span>      <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>  PX COORDINATOR              <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>        <span style="color: #66cc66;">|</span>      <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>   PX SEND QC <span style="color: #66cc66;">&#40;</span>RANDOM<span style="color: #66cc66;">&#41;</span>        <span style="color: #66cc66;">|</span> :TQ10001 <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   976K<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">256</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:04 <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>01 <span style="color: #66cc66;">|</span> P<span style="color: #66cc66;">-</span>&amp;gt;S <span style="color: #66cc66;">|</span> QC <span style="color: #66cc66;">&#40;</span>RAND<span style="color: #66cc66;">&#41;</span>  <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|*</span>  <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    HASH <span style="color: #993333; font-weight: bold;">JOIN</span>                 <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   976K<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">256</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:04 <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>01 <span style="color: #66cc66;">|</span> PCWP <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>     PX BLOCK ITERATOR        <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   488K<span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">23</span>   <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:01 <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>01 <span style="color: #66cc66;">|</span> PCWC <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>      <span style="color: #993333; font-weight: bold;">TABLE</span> ACCESS <span style="color: #993333; font-weight: bold;">FULL</span>       <span style="color: #66cc66;">|</span> FACT_B   <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">99999</span> <span style="color: #66cc66;">|</span>   488K<span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">23</span>   <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:01 <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>01 <span style="color: #66cc66;">|</span> PCWP <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">6</span> <span style="color: #66cc66;">|</span>     BUFFER SORT              <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>01 <span style="color: #66cc66;">|</span> PCWC <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">7</span> <span style="color: #66cc66;">|</span>      PX RECEIVE              <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span>   995K<span style="color: #66cc66;">|</span>  4860K<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">224</span>   <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:03 <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>01 <span style="color: #66cc66;">|</span> PCWP <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">|</span>       PX SEND BROADCAST <span style="color: #993333; font-weight: bold;">LOCAL</span><span style="color: #66cc66;">|</span> :TQ10000 <span style="color: #66cc66;">|</span>   995K<span style="color: #66cc66;">|</span>  4860K<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">224</span>   <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:03 <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>       <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>00 <span style="color: #66cc66;">|</span> P<span style="color: #66cc66;">-</span>&amp;gt;P <span style="color: #66cc66;">|</span> BCST <span style="color: #993333; font-weight: bold;">LOCAL</span> <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">|</span>        PX BLOCK ITERATOR     <span style="color: #66cc66;">|</span>          <span style="color: #66cc66;">|</span>   995K<span style="color: #66cc66;">|</span>  4860K<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">224</span>   <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:03 <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>00 <span style="color: #66cc66;">|</span> PCWC <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">|</span>  <span style="color: #cc66cc;">10</span> <span style="color: #66cc66;">|</span>         <span style="color: #993333; font-weight: bold;">TABLE</span> ACCESS <span style="color: #993333; font-weight: bold;">FULL</span>    <span style="color: #66cc66;">|</span> FACT_A   <span style="color: #66cc66;">|</span>   995K<span style="color: #66cc66;">|</span>  4860K<span style="color: #66cc66;">|</span>   <span style="color: #cc66cc;">224</span>   <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">|</span> 00:00:03 <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>  Q1<span style="color: #66cc66;">,</span>00 <span style="color: #66cc66;">|</span> PCWP <span style="color: #66cc66;">|</span>            <span style="color: #66cc66;">|</span>
<span style="color: #808080; font-style: italic;">--------------------------------------------------------------------------------------------------------------------------------------</span>
Predicate Information <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">IDENTIFIED</span> <span style="color: #993333; font-weight: bold;">BY</span> operation id<span style="color: #66cc66;">&#41;</span>:
<span style="color: #808080; font-style: italic;">---------------------------------------------------</span>
   <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">-</span> access<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;A&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;PART_COL1&quot;</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;B&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;PART_COL1&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>如果hash partitions的个数与默认的DOP一致，那当然可以节省很多时间，如果不是呢，而且要修改Hash Partitions的个数其实不是一件很容易的事情，那就只能通过调整DOP来得到一个好的执行计划了。两种方法：</p>
<ul>
<li>在表一级，通过 alter table parallel &lt;degree&gt;</li>
<li>在SQL一级，通过/*+ parallel (table_name, &lt;degree&gt; */</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.os2ora.com/how-to-decide-the-number-of-hash-partitions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
