<?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; 12c</title>
	<atom:link href="https://blog.developpez.com/pachot/tag/12c/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>12c: les niveaux de compression changent de nom</title>
		<link>https://blog.developpez.com/pachot/compression_ratio/</link>
		<comments>https://blog.developpez.com/pachot/compression_ratio/#comments</comments>
		<pubDate>Tue, 12 Nov 2013 15:27:57 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[12c]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[HCC]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=767</guid>
		<description><![CDATA[En 12c les niveaux de compression changent de noms, en présisant le stockage en ligne ou colonne en ligne (ROW STORE): les colonnes d&#8217;une même ligne sont ensembles, les lignes sont stockées les unes à la suite des autres dans &#8230; <a href="https://blog.developpez.com/pachot/compression_ratio/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>En 12c les niveaux de compression changent de noms, en présisant le stockage en ligne ou colonne</p>
<ul>
<li>en ligne (ROW STORE): les colonnes d&rsquo;une même ligne sont ensembles, les lignes sont stockées les unes à la suite des autres dans des blocs
</li>
<li>ou en colonne (COLUMN STORE): les valeurs des colonnes de plusieurs lignes sont regroupées en vecteurs, Les vecteurs sont stockés dans le Compression Unit<br />
Si vous avez déjà utilisé des <a href="http://docs.oracle.com/cd/E16655_01/appdev.121/e18410/ch_nine.htm#ZZPRE846" title="Host Array">Host Array</a> pour insérer en bulk, c&rsquo;est un peu la même idée. On a une meilleur compression lorsqu&rsquo;on retrouve les mêmes valeurs d&rsquo;une ligne à l&rsquo;autre.
</li>
</ul>
<p><strong>Sans option Advanced compression:</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">NOCOMPRESS</div></div>
<p>Pas de compression</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ROW STORE COMPRESS BASIC</div></div>
<p>Basic Table Compression (aka &lsquo;COMPRESS&rsquo; ou &lsquo;ROW STORE COMPRESS&rsquo;)<br />
Lors des insert en direct-path, au niveau de chaque bloc, les valeurs dupliquées ne sont stockées qu&rsquo;une fois (en utilisant des pointeurs &#8211; utile seulement pour des tailles supérieures à quelques octets)<br />
Lors de DML conventionnel, les lignes sont décompressées, donc utile en chargement de masse seulement.</p>
<p><strong>Avec option Advanced Compression</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ROW STORE COMPRESS ADVANCED</div></div>
<p>Advanced Table Compression (aka &lsquo;COMPRESS FOR OLTP&rsquo;)<br />
Même chose que BASIC, mais le DML conventionnel permet de compresser aussi.</p>
<p><strong>sous Exadata et ZFS, avec stockage colonne</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">COLUMN STORE COMPRESS FOR QUERY LOW/HIGH</div></div>
<p>Warehouse compression (aka Hybrid Columnar Compression QUERY LOW/HIGH)<br />
Stockage en colonne dans des Compression Unit, utilise plus de CPU (surtout en HIGH)<br />
Lors des inserts en direct-path seulement, le DML conventionnel remet les lignes en stockage ligne, donc avec moins bon taux de compression et chained rows.<br />
QUERY: Valable pour des données qui ne sont pas modifiées, mais la lecture est rapide (l&rsquo;économie d&rsquo;I/O compense le surplus de CPU)</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">COLUMN STORE COMPRESS FOR ARCHIVE LOW/HIGH</div></div>
<p>Archive compression (aka Hybrid Columnar Compression ARCHIVE LOW/HIGH)<br />
Stockage en colonne dans des Compression Unit, utilise plus de CPU (surtout en HIGH)<br />
Lors des inserts en direct-path seulement, le DML conventionnel remet les lignes en stockage ligne, donc avec moins bon taux de compression et chained rows.<br />
ARCHIVE: Valable pour des données qui ne sont pas modifiées et peu lues (car forte utilisation CPU pour décompresser aussi)</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>12c: des noms de Wait Events plus parlants</title>
		<link>https://blog.developpez.com/pachot/12c_display_name/</link>
		<comments>https://blog.developpez.com/pachot/12c_display_name/#comments</comments>
		<pubDate>Mon, 28 Oct 2013 17:05:34 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[12c]]></category>
		<category><![CDATA[db file sequential read]]></category>
		<category><![CDATA[db file squattered read]]></category>
		<category><![CDATA[wait events]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=871</guid>
		<description><![CDATA[Certains noms de wait events sont trompeurs. C&#8217;est le cas par exemple de &#8216;db file sequential read&#8217; qui n&#8217;est pas ce qu&#8217;on entend par lecture disque séquentielle, mais plutôt une lecture monobloc (donc plutôt des i/o randoms). Alors que &#8216;log &#8230; <a href="https://blog.developpez.com/pachot/12c_display_name/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Certains noms de wait events sont trompeurs. C&rsquo;est le cas par exemple de &lsquo;db file sequential read&rsquo; qui n&rsquo;est pas ce qu&rsquo;on entend par lecture disque séquentielle, mais plutôt une lecture monobloc (donc plutôt des i/o randoms).<br />
Alors que &lsquo;log file sequential read&rsquo; est bien une lecture de plusieurs blocs contigus.</p>
<p>La <a href="http://docs.oracle.com/cd/E16655_01/server.121/e17615/waitevents003.htm#BGGIBDJI" title="doc">doc</a> précise leur définition, mais en 12c on a aussi un &lsquo;Display Name&rsquo; qui permet à Oracle de montrer un nom un peu plus parlant.</p>
<p>Voici ceux dont le &lsquo;display name&rsquo; est différent du nom de l&rsquo;event:</p>
<pre>select wait_class,name, display_name from v$event_name where display_name != name order by 1,2;</pre>
<table>
<tr>
<th scope="col">WAIT_CLASS
</th>
<th scope="col">NAME
</th>
<th scope="col">DISPLAY_NAME
</th>
</tr>
<tr>
<td>Administrative
</td>
<td>concurrent I/O completion
</td>
<td>online move datafile IO completion
</td>
</tr>
<tr>
<td>Administrative
</td>
<td>datafile copy range completion
</td>
<td>online move datafile copy range completion
</td>
</tr>
<tr>
<td>Administrative
</td>
<td>wait for possible quiesce finish
</td>
<td>quiesce database completion
</td>
</tr>
<tr>
<td>Commit
</td>
<td>log file sync
</td>
<td>commit: log file sync
</td>
</tr>
<tr>
<td>Configuration
</td>
<td>log buffer space
</td>
<td>log buffer full &#8211; LGWR bottleneck
</td>
</tr>
<tr>
<td>Idle
</td>
<td>LGWR real time apply sync
</td>
<td>standby apply advance notification
</td>
</tr>
<tr>
<td>Other
</td>
<td>DFS db file lock
</td>
<td>quiesce for datafile offline
</td>
</tr>
<tr>
<td>Other
</td>
<td>Image redo gen delay
</td>
<td>redo resource management
</td>
</tr>
<tr>
<td>Other
</td>
<td>datafile move cleanup during resize
</td>
<td>online move datafile resize cleanup
</td>
</tr>
<tr>
<td>System I/O
</td>
<td>control file sequential read
</td>
<td>control file read
</td>
</tr>
<tr>
<td>System I/O
</td>
<td>control file single write
</td>
<td>control file write
</td>
</tr>
<tr>
<td>System I/O
</td>
<td>db file parallel write
</td>
<td>db list of blocks write
</td>
</tr>
<tr>
<td>System I/O
</td>
<td>log file parallel write
</td>
<td>log file redo write
</td>
</tr>
<tr>
<td>System I/O
</td>
<td><strong>log file sequential read</strong>
</td>
<td><strong>log file multiblock read</strong>
</td>
</tr>
<tr>
<td>System I/O
</td>
<td>log file single write
</td>
<td>log file header write
</td>
</tr>
<tr>
<td>User I/O
</td>
<td>db file parallel read
</td>
<td>db list of blocks read
</td>
</tr>
<tr>
<td>User I/O
</td>
<td><strong>db file scattered read</strong>
</td>
<td><strong>db multiblock read</strong>
</td>
</tr>
<tr>
<td>User I/O
</td>
<td><strong>db file sequential read</strong>
</td>
<td><strong>db single block read</strong>
</td>
</tr>
<tr>
<td>User I/O
</td>
<td>db file single write
</td>
<td>db single block write
</td>
</tr>
</table>
<p>La différentiation des i/o single block et multiblock est particulièrement intéressante.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>12c: optimisation des appels de fonctions PL/SQL à partir de SQL</title>
		<link>https://blog.developpez.com/pachot/12c_udf_pragma/</link>
		<comments>https://blog.developpez.com/pachot/12c_udf_pragma/#comments</comments>
		<pubDate>Mon, 16 Sep 2013 19:16:11 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[12c]]></category>
		<category><![CDATA[pragma]]></category>
		<category><![CDATA[udf]]></category>
		<category><![CDATA[with_plqsl]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=703</guid>
		<description><![CDATA[Dans les requêtes SQL, on peut utiliser des fonctions standard (substr, to_date,&#8230; ) et lorsqu&#8217;on a un besoin un peu plus spécifique, on peut créer des des UDF (User Defined Function). Avec Oracle, les fonctions standard sont codées en C, &#8230; <a href="https://blog.developpez.com/pachot/12c_udf_pragma/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Dans les requêtes SQL, on peut utiliser des fonctions standard (substr, to_date,&#8230; ) et lorsqu&rsquo;on a un besoin un peu plus spécifique, on peut créer des des UDF (User Defined Function).<br />
Avec Oracle, les fonctions standard sont codées en C, directement exécutable lors de l&rsquo;exécution SQL. Mais les UDF sont simplement des appels à des fonctions PL/SQL stockées. Le problème lorsqu&rsquo;on passe d&rsquo;un language (SQL) à un autre (PL/SQL) en cours d&rsquo;exécution: il y a un switch de contexte à chaque fois. C&rsquo;est très consommateur de CPU. Surtout lorsqu&rsquo;on appelle la fonction pour chaque ligne.</p>
<p>Jusqu&rsquo;en 11g, les solutions sont:</p>
<ul>
<li>Utiliser seulement des fonctions standard</li>
<li>Eviter l&rsquo;appel ligne à ligne avec les pipelined functions</li>
<li>Lorsque le résultat de la fonction est déterministe et qu&rsquo;il est applelé plusieurs fois pour les même valeurs, déclarer la fonction en deterministic</li>
</ul>
<p>En 12c on a des vrais UDF optimisées pour les appels à partir de SQL.</p>
<p>On peut utiliser le pragma UDF pour une fonction stockée, par exemple:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">create or replace function TEST_SPELL(n number) return varchar2 as pragma UDF; begin return to_char( date'-4712-01-01'+n-1,'Jsp'); end;<br />
/<br />
select max(spelled) from ( select TEST_SPELL(num) spelled from TEST);</div></div>
<p>Et on peut aussi déclarer la fonction comme un bloc PL/SQL anonyme dans la requête SQL:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">with function TEST_SPELL(n number) return varchar2 as begin return to_char( date'-4712-01-01'+n-1,'Jsp'); end; <br />
select /*+ TEST1 */ max(spelled) from ( select TEST_SPELL(num) spelled from TEST)<br />
&nbsp;/</div></div>
<p><ins datetime="2013-09-16T18:42:15+00:00">Dans la <a href="http://ora-demo.pachot.net/12c_udf_pragma.html" title="demo" target="_blank">demo</a> j&rsquo;appelle une fonction simple pour 1 million de lignes</ins><br />
Dans la version 11g, les temps &lsquo;sql execute elapsed time&rsquo; et &lsquo;PL/SQL execution elapsed time&rsquo; sont considérables, alors que ni la requête ni la fonction ne sont très complexes.<br />
C&rsquo;est parce chacun inclut le switch de contexte vers l&rsquo;autre language.<br />
En utilisant pragma udf ou le with plsql (déjà exposé <a href="http://blog.developpez.com/pachot/12c_with_plsql/">ici</a>) c&rsquo;est une centaine de secondes que l&rsquo;on gagne pour les 1 million d&rsquo;appels.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>12c: colonnes auto-incrémentées</title>
		<link>https://blog.developpez.com/pachot/12c-identity-columns/</link>
		<comments>https://blog.developpez.com/pachot/12c-identity-columns/#comments</comments>
		<pubDate>Mon, 02 Sep 2013 20:32:54 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[12c]]></category>
		<category><![CDATA[generated]]></category>
		<category><![CDATA[sequence]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=646</guid>
		<description><![CDATA[En 12c on peut déclarer des colonnes auto-incrémentées en suivant la syntaxe SQL standard: create table TEST ( id number generated always as identity , n number ); Plus besoin de déclarer la sequence, c&#8217;est implicite. Et cette syntaxe empêche &#8230; <a href="https://blog.developpez.com/pachot/12c-identity-columns/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>En 12c on peut déclarer des colonnes auto-incrémentées en suivant la syntaxe SQL standard:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">create table TEST ( id number generated always as identity , n number );</div></div>
<p>Plus besoin de déclarer la sequence, c&rsquo;est implicite. Et cette syntaxe empêche de mettre une autre valeur que celle qui sera générée.</p>
<p>En 12c on peut aussi utiliser une sequence comme valeur par défaut (générée seulement lorsqu&rsquo;on ne spécifie pas la valeur). et la syntaxe pour les colonnes quto-incrémentées est la suivante:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">id number generated by default as identity</div></div>
<p>Enfin, nouvelle feature en 12c, on peut préciser si la valeur par défaut remplace un null:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">id number generated by default on null as identity</div></div>
<p><ins datetime="2013-09-02T20:12:27+00:00">Les exemples dans la <a href="http://ora-demo.pachot.net/12c-identity-columns.html" title="demo" target="_blank">demo</a></ins></p>
<p>Attention, la colonne est NOT NULL, mais ne déclare pas de primary key (ni d&rsquo;unicité) implicitement.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>12c: faibles améliorations sur les verrous en intégrité référentielle</title>
		<link>https://blog.developpez.com/pachot/lock_dml_behaviour/</link>
		<comments>https://blog.developpez.com/pachot/lock_dml_behaviour/#comments</comments>
		<pubDate>Sat, 10 Aug 2013 19:47:52 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[12c]]></category>
		<category><![CDATA[foreign key]]></category>
		<category><![CDATA[lock]]></category>
		<category><![CDATA[Row-X]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=625</guid>
		<description><![CDATA[En 11g les verrous Row-S posés sur la table opposée lors de DML sur une table ayant un intégrité référentielle sont devenus des Row-X Et cela a amené pas mal de régression: lorsqu&#8217;il y a des tables verrouillées en Share &#8230; <a href="https://blog.developpez.com/pachot/lock_dml_behaviour/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>En 11g les verrous Row-S posés sur la table opposée lors de DML sur une table ayant un intégrité référentielle sont devenus des Row-X<br />
Et cela a amené pas mal de régression: lorsqu&rsquo;il y a des tables verrouillées en Share (à cause de foreign key non indexées) l&rsquo;impact est devenu beaucoup plus important. Cette régression a été introduite pour corriger un bug: Bug 5909305 &#8211; Change to DML (TM) lock modes for foreign key constraints (Doc ID 5909305.8)</p>
<p>Il semble qu&rsquo;en 12c ce soit un peu mieux: Certains Row-X redeviennent des Row-S, verrous légers qui ne bloquent aucun DML.</p>
<ul>
<li>Sur insert dans table parente. C&rsquo;est maintenant un Rows-S qui est posé sur les tables filles, comme avant la 11g</li>
<li>Lorsqu&rsquo;on fait un delete sur une table fille on retrouve un Row-S sur la table parent comme avant la 11g</li>
</ul>
<p>Par contre, on a toujours un Row-X sur la table parent lorsqu&rsquo;on insert dans la table fille ou qu&rsquo;on update la foreign key.</p>
<p><ins datetime="2013-08-09T15:08:34+00:00">La liste complète des verrous posés par différentes opérations dans la <a href="https://googledrive.com/host/0Bxhrc9V4eGzdd3liTDMwdmFmM2s/lock_dml_behaviour.html" title="demo" target="_blank">demo</a></ins>.</ins></p>
<p>Les explications de ces verrous dans la préz (11g): <a href="http://prezi.com/uzdd5ttg4cu0/indexing-foreign-keys-in-oracle/" title="indexing-foreign-keys-in-oracle">http://prezi.com/uzdd5ttg4cu0/indexing-foreign-keys-in-oracle/</a></p>
<p>Et une explication sur les modes de verrous: <a href="http://www.soug.ch/fileadmin/user_upload/Newsletter/NL_public/NL_2013_1_Award_Article.pdf"> http://www.soug.ch/fileadmin/user_upload/Newsletter/NL_public/NL_2013_1_Award_Article.pdf</a> et <a href="http://prezi.com/cdckwsgqxeyi/oracle-table-lock-modes/"> http://prezi.com/cdckwsgqxeyi/oracle-table-lock-modes/</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>12c: &#8216;update global indexes&#8217; enfin très rapide sur drop et truncate</title>
		<link>https://blog.developpez.com/pachot/12c_global_index_maintenance/</link>
		<comments>https://blog.developpez.com/pachot/12c_global_index_maintenance/#comments</comments>
		<pubDate>Tue, 06 Aug 2013 20:48:58 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[MicroLearning]]></category>
		<category><![CDATA[12c]]></category>
		<category><![CDATA[global index]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=614</guid>
		<description><![CDATA[On partitionne les tables pour 2 raisons: Performance: aller lire un plus petit segment en full scan, ou un plus petit index local grâce au partition pruning Maintenabilité: faire des opérations de purge, archivage, reorganisation, voir chargement (avec exchange partition) &#8230; <a href="https://blog.developpez.com/pachot/12c_global_index_maintenance/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>On partitionne les tables pour 2 raisons:</p>
<ul>
<li>Performance: aller lire un plus petit segment en full scan, ou un plus petit index local grâce au partition pruning</li>
<li>Maintenabilité: faire des opérations de purge, archivage, reorganisation, voir chargement (avec exchange partition) de manière très facile</li>
</ul>
<p>Mais toutes les requêtes ne font pas de partition pruning, et on est amené créer des index globaux pour des raisons de performances. Mais alors on perd de la maintenabilité: les opérations sur les partitions vont:
<ul>
<li>soit rendre l&rsquo;index unusable, qu&rsquo;il faudra rebuilder complètement. Ce n&rsquo;est pas acceptable lorsque notre maintenance ne touchait qu&rsquo;une partition parmi beaucoup d&rsquo;autres</li>
<li>soit utiliser &lsquo;update global indexes&rsquo; pour maintenir l&rsquo;index au fur et à mesure. Mais l&rsquo;opération devient alors très longue.</li>
</ul>
<p>Et pourtant, s&rsquo;il s&rsquo;agit d&rsquo;un DROP PARTITION ou TRUNCATE PARTITION, cette maintenance d&rsquo;index consiste seulement à nettoyer les entrées d&rsquo;index qui deviennent orphelines (i.e qui adressent un rowid qui n&rsquo;existe plus).</p>
<p>Alors la 12c a optimisé cela en faisant l&rsquo;opération en 2 temps, utilisant la fonctionnalité &lsquo;Asynchronous Global Index Maintenance&rsquo; ou &lsquo;Fast Index maintenance':</p>
<ol>
<li>un ALTER TABLE &#8230; DROP/TRUNCATE PARTITION UPDATE GLOBAL INDEXES</li>
<p> ne va pas toucher aux index globaux. Il va seulement enregistrer le data_object_id du segment qu&rsquo;on vient de supprimer (un truncate ne supprime pas vraiement le segment, mais en change son data_object_id ce qui revient au même logiquement). C&rsquo;est enregistré dans la table du dictionnaire SYS.INDEX_ORPHANED_ENTRY$.</p>
<li>les requêtes qui lisent l&rsquo;index chargent ces infos pour ignorer tous les rowid qui référencent ce data_object_id</li>
<li>un job automatique (un de plus) va faire le nettoyage de manière asynchrone</li>
</ol>
<p>On peut faire ce nettoyage nous même avec</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ALTER INDEX ... COALESCE CLEANUP;</div></div>
<p>mais aussi appeler</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">exec dbms_part.cleanup_gidx;</div></div>
<p>qui va faire ce coalesce sur tous les index référencés par</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SYS.INDEX_ORPHANED_ENTRY$</div></div>
<p><ins datetime="2013-08-08T15:36:37+00:00">Différentes variations dans la <a href="http://ora-demo.pachot.net/12c_global_index_maintenance.html" title="demo" target="_blank">demo</a></ins>.<br />
Le cleanup peut charger la machine, c&rsquo;est peut-être mieux de l&rsquo;anticiper à un moment de faible charge plutôt que de le laisser tourner à 2 heures du matin comme c&rsquo;est planifié par défaut.</p>
<p>C&rsquo;est une amélioration importante: en Entreprise Edition, il n&rsquo;y a plus à hésiter pour partitionner les tables qui grossissent afin que l&rsquo;augmentation du volume de l&rsquo;historique ne pénalise pas les performances. Sans avoir peur de définir trop d&rsquo;index global. Une fois partitionné, ce sera facile de maintenir les plus anciennes partitions: purger, archiver, déplacer sur des tablespaces (move online en 12c) qui sont sur des disques moins chers. Et plus on laisse les tables grossir, plus l&rsquo;opération de partitionnement sera compliquée !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>12c: inclure une fonction PL/SQL dans la requête SQL</title>
		<link>https://blog.developpez.com/pachot/12c_with_plsql/</link>
		<comments>https://blog.developpez.com/pachot/12c_with_plsql/#comments</comments>
		<pubDate>Sun, 28 Jul 2013 19:24:15 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[12c]]></category>
		<category><![CDATA[pl/sql]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=596</guid>
		<description><![CDATA[En 12c, on peut mettre une fonction PL/SQL dans la clause WITH d&#8217;une requête SQL. Par exemple: with &#160; &#160; &#160;function to_number_or_null(n varchar2) &#160; &#160; &#160;return number deterministic &#160; &#160; &#160;is &#160; &#160; &#160; begin &#160; &#160; &#160; &#160;return to_number(n); &#8230; <a href="https://blog.developpez.com/pachot/12c_with_plsql/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>En 12c, on peut mettre une fonction PL/SQL dans la clause WITH d&rsquo;une requête SQL.<br />
Par exemple:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">with <br />
&nbsp; &nbsp; &nbsp;function to_number_or_null(n varchar2) <br />
&nbsp; &nbsp; &nbsp;return number deterministic<br />
&nbsp; &nbsp; &nbsp;is<br />
&nbsp; &nbsp; &nbsp; begin<br />
&nbsp; &nbsp; &nbsp; &nbsp;return to_number(n);<br />
&nbsp; &nbsp; &nbsp; exception<br />
&nbsp; &nbsp; &nbsp; &nbsp;when others then return null;<br />
&nbsp; &nbsp; &nbsp; end; <br />
select * from v$parameter where name='db_block_size' and to_number_or_null(value)=8192; <br />
/</div></div>
<p>Ici j&rsquo;ai déclaré une fonction vite fait qui m&rsquo;évite de récupérer un &lsquo;ORA-01722: invalid number&rsquo; lorsque la valeur n&rsquo;est pas un nombre.</p>
<p>On s&rsquo;aperçoit que l&rsquo;exécution est beaucoup plus rapide lorsqu&rsquo;il y a beaucoup d&rsquo;appels. (cf. <a href="http://ora-demo.pachot.net/12c_with_plsql.html#2" title="demo" target="_blank">demo</a>). C&rsquo;est plus rapide que d&rsquo;appeler une fonction stockée &#8211; sauf pour une fonction deterministic qui bénéficie du cache.</p>
<p>A noter: le temps d&rsquo;exécution n&rsquo;est pas comptabilisé dans &lsquo;PL/SQL execution elapsed time&rsquo; du Time Model</p>
<p>Attention: certains clients (comme sqlplus 11g) posent des problèmes à cause des points-virgules dans la requête.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>12c Nouvelles opérations online</title>
		<link>https://blog.developpez.com/pachot/12c_online_operations/</link>
		<comments>https://blog.developpez.com/pachot/12c_online_operations/#comments</comments>
		<pubDate>Thu, 18 Jul 2013 07:00:48 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[12c]]></category>
		<category><![CDATA[online]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=520</guid>
		<description><![CDATA[On a vu une opération online sur les fichiers: 12c: déplacer un datafile online et la 12c amène plusieurs nouvelles opérations sur les tables qui peuvent être faites online. Commençons par celles qui ne nécessitent pas le mot clé &#8216;ONLINE&#8217; &#8230; <a href="https://blog.developpez.com/pachot/12c_online_operations/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>On a vu une opération online sur les fichiers: <a href="http://blog.developpez.com/pachot/12c_move_datafile/" title="12c: déplacer un datafile online">12c: déplacer un datafile online</a> et la 12c amène plusieurs nouvelles opérations sur les tables qui peuvent être faites online.</p>
<p>Commençons par celles qui ne nécessitent pas le mot clé &lsquo;ONLINE&rsquo; et qui sont donc possible en Standard Edition: on peut rendre un index visible/invisible sans poser de verrou DML.</p>
<p>Et les opérations qui peuvent se faire avec &lsquo;ONLINE&rsquo; en Enterprise Edition:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ALTER INDEX ... UNUSABLE ONLINE;<br />
DROP INDEX ... ONLINE;<br />
ALTER TABLE ... DROP CONSTRAINT ... ONLINE;<br />
ALTER TABLE ... SET UNUSED(...) ONLINE;<br />
ALTER TABLE ... MOVE PARTITION ... ONLINE;</div></div>
<p>Le MOVE d&rsquo;une table non partitionnée ne prends pas le &lsquo;ONLINE&rsquo;, mais on pouvait déjà le faire avec dbms_redefinition.</p>
<p><ins datetime="2013-07-08T14:55:41+00:00">Les exemples avec les modes de verrous exacts posés par ces opérations dans la <a href="http://ora-demo.pachot.net/12c_online_operations.html" title="demo" target="_blank">demo</a>.</ins></p>
<p>La plupart de ces opérations posent seulement un Row-S et c&rsquo;est vraiment online puisque seulement les DDL exclusifs sont bloqués/bloquants.<br />
Mais certaines posent un Row-X qui peuvent être bloqués par des opérations DML (cas de la foreign key non indexée).</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
