<?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>Oracle - Concepts et Exemples &#187; Parallel DML</title>
	<atom:link href="https://blog.developpez.com/pachot/tag/parallel-dml/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/pachot</link>
	<description>Les fonctionalités et concepts d&#039;Oracle à partir de traductions et de démos</description>
	<lastBuildDate>Sun, 03 Apr 2016 20:36:21 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Comment vérifier et activer Parallel DML (nouveauté 11.2.0.4 et 12c)</title>
		<link>https://blog.developpez.com/pachot/12c_parallel_dml/</link>
		<comments>https://blog.developpez.com/pachot/12c_parallel_dml/#comments</comments>
		<pubDate>Wed, 18 Sep 2013 20:29:22 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[MicroLearning]]></category>
		<category><![CDATA[Parallel DML]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=715</guid>
		<description><![CDATA[Vous utilisez Parallel Query pour manipuler des gros volumes de données, lors d&#8217;un ETL par exemple. Mais êtes vous sûrs que les inserts /*+ append */ aussi se font en parallèle ? Voici un plan d&#8217;exécution où la partie select &#8230; <a href="https://blog.developpez.com/pachot/12c_parallel_dml/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Vous utilisez Parallel Query pour manipuler des gros volumes de données, lors d&rsquo;un ETL par exemple. Mais êtes vous sûrs que les inserts /*+ append */ aussi se font en parallèle ?</p>
<p>Voici un plan d&rsquo;exécution où la partie select est en parallel mais un seul process fait l&rsquo;insert:</p>
<pre>--------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name     | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT                   |          |     1 |     2   (0)| 00:00:01 |        |      |            |
|   1 |  <strong>LOAD AS SELECT</strong>                    | TEST     |       |            |          |        |      |            |
|   2 |   PX COORDINATOR                   |          |       |            |          |        |      |            |
|   3 |    PX SEND QC (RANDOM)             | :TQ10000 |     1 |     2   (0)| 00:00:01 |  Q1,00 | P-&gt;S | QC (RAND)  |
|   4 |     OPTIMIZER STATISTICS GATHERING |          |     1 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   5 |      PX BLOCK ITERATOR             |          |     1 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   6 |       TABLE ACCESS FULL            | TEST     |     1 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |
--------------------------------------------------------------------------------------------------------------------</pre>
<p>Le problème ici est que le process coordinateur est le seul à faire l&rsquo;insert. Il devient donc bottleneck lorsqu&rsquo;on augmente le DOP.<br />
Ce n&rsquo;est pas facile à voir. On voit ça dans le plan d&rsquo;exécution parce que<br />
LOAD AS SELECT est au dessus du PX COORDINATOR, donc exécuté par le seul process coordinateur.</p>
<p>Ce n&rsquo;est pas parce qu&rsquo;une table est en parallèle que l&rsquo;insert va se faire en parallèle. Il faut explicitement activer Parallel DML dans la session. </p>
<p>Voici le plan de la même requête après avoir fait<br />
ALTER SESSION ENABLE PARALLEL DML;</p>
<pre>--------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name     | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT                   |          |     1 |     2   (0)| 00:00:01 |        |      |            |
|   1 |  PX COORDINATOR                    |          |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)              | :TQ10000 |     1 |     2   (0)| 00:00:01 |  Q1,00 | P-&gt;S | QC (RAND)  |
|   3 |    <strong>LOAD AS SELECT</strong>                  | TEST     |       |            |          |  Q1,00 | PCWP |            |
|   4 |     OPTIMIZER STATISTICS GATHERING |          |     1 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR             |          |     1 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   6 |       TABLE ACCESS FULL            | TEST     |     1 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |
--------------------------------------------------------------------------------------------------------------------</pre>
<p>Ce sont les process parallèles TQ10000 qui font l&rsquo;insert (le LOAD AS SELECT) ici et le coordinateur n&rsquo;est plus bottleneck. On devient scalable et on peut augmenter le degré de parallélisme tant qu&rsquo;on a des ressources CPU et I/O.</p>
<p>Pourquoi doit-on explicitement activer Parallel DML alors que c&rsquo;est automatique pour Parallel Query ?<br />
C&rsquo;est parce en dehors de la différence de performance, le comportement en concurrence d&rsquo;accès est très différent: verrouillage exclusif de la table.<br />
Oracle ne va pas faire ça sans demande explicite. On ne peut le faire que lorsqu&rsquo;on sait qu&rsquo;il n&rsquo;y aura pas de DML concurrent sur la table.<br />
Sur un CREATE TABLE AS SELECT, pas besoin puisque de toute façon personne d&rsquo;autre n&rsquo;utilise la table.</p>
<p>On ne peut pas activer Parallel DML au niveau de l&rsquo;instance. C&rsquo;est au niveau de la session qu&rsquo;on le fait. Et si on veut que ce soit automatique sans changer le code, une solution est de mettre cet alter session dans un logon trigger pour le user en question.</p>
<p>Et nouveauté en 11.2.0.4 et en 12c &#8211; mais non documentée &#8211; il est possible d&rsquo;activer ou désactiver Parallel DML au niveau d&rsquo;une requête avec les hints ENABLE_PARALLEL_DML et DISABLE_PARALLEL_DML</p>
<p><ins datetime="2013-09-18T19:44:36+00:00">Des explain plan avec les différentes combinaisons dans la <a href="https://googledrive.com/host/0Bxhrc9V4eGzdd3liTDMwdmFmM2s/12c_parallel_dml.html" title="demo" target="_blank">demo</a>.</ins></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
