<?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; Articles</title>
	<atom:link href="https://blog.developpez.com/pachot/category/franck-pachot/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>Faut-il toujours indexer les clés étrangères ?</title>
		<link>https://blog.developpez.com/pachot/faut_il_indexer_les_cles_etrangeres/</link>
		<comments>https://blog.developpez.com/pachot/faut_il_indexer_les_cles_etrangeres/#comments</comments>
		<pubDate>Tue, 29 May 2012 15:19:22 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[Articles]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pour actualiser un peu ce blog sur lequel je n&#8217;ai rien posté depuis 1 an, voici un lien sur une présentation (en anglais) sur l&#8217;indexation des clés étrangères (foreign key): http://prezi.com/uzdd5ttg4cu0/indexing-foreign-keys-in-oracle/ Plutôt que de la traduire, je résume ici les &#8230; <a href="https://blog.developpez.com/pachot/faut_il_indexer_les_cles_etrangeres/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Pour actualiser un peu ce blog sur lequel je n&rsquo;ai rien posté depuis 1 an, voici un lien sur une présentation (en anglais) sur l&rsquo;indexation des clés étrangères (<em>foreign key</em>):<br />
<a href="http://prezi.com/uzdd5ttg4cu0/indexing-foreign-keys-in-oracle/">http://prezi.com/uzdd5ttg4cu0/indexing-foreign-keys-in-oracle/</a></p>
<p>Plutôt que de la traduire, je résume ici les idées principales pour aider à la lecture pour les francophones. Et n&rsquo;hésitez pas à poser des questions ici.</p>
<h2>Comportement d&rsquo;Oracle lorsqu&rsquo;il n&rsquo;y a pas d&rsquo;index sur la clé étrangère</h2>
<p>L&rsquo;idée qu&rsquo;il faut toujours indexer les clés étrangères vient des anciennes versions où on se retrouvait avec un verrou table (TM-Share) lorsqu&rsquo;on on modifiait une table.<br />
Sous Oracle 7, c&rsquo;est la table parent qui est vérouillée lorsqu&rsquo;on insère un enregistrement dans la table fille. Puis à partir de la 8i c&rsquo;est l&rsquo;inverse: la table fille est vérouillée lorsqu&rsquo;on supprime un enregistrement de la table parent.</p>
<p>Mais cela a été vite optimisé en 9i: ce verrou est relâché dès que la ligne parent est supprimée. Le verrou ne reste pas jusqu&rsquo;à la fin de la transaction. C&rsquo;est la raison pour laquelle on peut lire parfois qu&rsquo;il n&rsquo;y a plus de problème de verrou lorsque la clé étrangère n&rsquo;est pas indexée. C&rsquo;est faux. C&rsquo;est juste que le verrou dure moins longtemps.</p>
<p>Mais il ne faut pas oublier que si la clé étrangère n&rsquo;est pas indexée, alors la suppression d&rsquo;une ligne parent devra faire un full scan de la table fille. Parce qu&rsquo;il faudra vérifier que rien ne référence le parent qu&rsquo;on veut supprimer. Et si la table fille est grosse, ça peut durer longemps. Et donc le verrou va quand même durer longtemps. Et pendant ce temps, toute modification sur la table sera bloquée, même si elle n&rsquo;a rien à voir avec le parent qu&rsquo;on est en train de supprimer.</p>
<p>Sur les version courantes d&rsquo;Oracle il est donc nécessaire d&rsquo;avoir un index sur la clé étrangère lorsque on a les 2 conditions suivantes:</p>
<ol>
<li>On peut supprimer (<em>delete</em>) une ligne de la table référencée (parent). C&rsquo;est aussi le cas si l&rsquo;on modifie (<em>update</em>) la colonne référencée. Mais on ne devrait pas modifier une clé normalement. On doit aussi penser aux cas des <em>delete cascade</em>, au cas de <em>merge</em>, etc.</li>
<li>Et si la table fille est grande et/ou a beaucoup d&rsquo;activité de modification dessus. Si ce n&rsquo;est pas le cas, le verrou table n&rsquo;aura pas une grande conséquence. Mais si c&rsquo;est le cas, on peut bloquer toute l&rsquo;application pendant un long moment.</li>
</ol>
<h2>En quoi un index peut aider ?</h2>
<p>La première chose, c&rsquo;est que l&rsquo;index sur la clé étrangère permettra de vérifier rapidement qu&rsquo;il n&rsquo;y a pas d&rsquo;enregistrements qui référenceraient la ligne qu&rsquo;on supprime, sans avoir à faire un <em>full table scan</em>. Avant tout, on crée les index pour des raisons de performance d&rsquo;accès.</p>
<p>La deuxième chose, c&rsquo;est qu&rsquo;en plus, lorsque Oracle va lire cet index, il va pouvoir vérifier qu&rsquo;il n&rsquo;y a pas d&rsquo;insert en cours, même non encore commité. Parce que un insert va toujours dans un block bien précis dans un index.</p>
<p>S&rsquo;il n&rsquo;y a pas d&rsquo;index, mais seulement la table pour vérifier, alors un insert peut aller n&rsquo;importe où et il faut donc verrouiller toute la table pour empêcher cela. S&rsquo;il y a un index, il suffit de verrouiller le bloc d&rsquo;index correspondant à la valeur du parent pour la durée de l&rsquo;opération de delete.</p>
<h2>Quel index est possible ?</h2>
<p>Si l&rsquo;on crée systématiquement un index sur toutes les clés étrangères, on va se retrouver avec de nombreux index superflus. Parce ce que ce qu&rsquo;il suffit d&rsquo;avoir c&rsquo;est un index qui commence par les colonnes indexées.<br />
Je rappelle l&rsquo;idée: si l&rsquo;index permet de retrouver directement une (potentielle) ligne fille, alors il peut aussi servir à éviter de verrouiller toute la table.</p>
<p>Exemple:</p>
<p>Sur la table suivante:</p>
<p><code class="codecolorer text default"><span class="text">table CHILD (a,b,c) ... references PARENT(a,b)</span></code></p>
<p>Les index suivants permettent d&rsquo;éviter les verrous table lors d&rsquo;un delete sur la table PARENT:</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 index on (a,b) <br />
create index on (b,a) <br />
create index on (a,b,c) <br />
create index on (a,b,c) compress <br />
create unique index on (a,b,c) <br />
create index on (a,b,upper(c)) <br />
CHILD is an IOT with primary key (a,b,c)</div></div>
<p>Par contre, ceux-là ne peuvent pas être utilisés pour ce but:</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 index on (c,b,a) <br />
create index on (a,c,b) <br />
create index on (a,upper(b)) <br />
create index on (a,b desc) <br />
create bitmap index on (a,b)</div></div>
<p><strong>il est donc important de ne pas indexer aveuglément, mais de choisir les index qui sont utiles pour les performances des accés aux données.</strong> Ensuite, on vérifie qu&rsquo;ils permettent aussi d&rsquo;éviter les cas de verrou table s&rsquo;ils peuvent avoir lieu.</p>
<h2>Comment vérifier quels verrous sont posés ?</h2>
<p>On a vu que le verrou est relâché dès que l&rsquo;opération de suppression est finie. il ne reste pas jusqu&rsquo;à la fin de la transaction. il est donc parfois difficile de le voir en test avec peu d&rsquo;utilisateurs concurrents. On peut par contre utiliser l&rsquo;<code class="codecolorer text default"><span class="text">event 10704</span></code> pour vérifier exactement quels verrous sont posés. La présentation montre un exemple avec son interprétation.</p>
<h2>Conclusion et conseils</h2>
<p>Lorsque une table parent peut avoir des <em>delete </em>dessus, même si c&rsquo;est rare, même si c&rsquo;est indirect (<em>delete cascade</em>) alors les tables filles peuvent se retrouver verrouillées s&rsquo;il n&rsquo;y a pas un index qui commence par les colonnes de la clé étrangère.<br />
Si La table fille est grande et/ou si il y a beaucoup de modifications dessus, ce verrou peut durer et peut bloquer toute modification.<br />
Dans ce cas, il faut indexer les clés étrangère. Mais pas aveuglément: on doit réfléchir à l&rsquo;ordre des colonnes, à utiliser un index qui sert aussi à autre chose, etc.</p>
<p>Par contre, les clés étrangères vers des tables de référence statiques n&rsquo;ont pas besoin d&rsquo;index. Sauf bien sûr pour des raisons d&rsquo;accès si on a besoin pour une jointure entre les deux table et que la sélectivité est assez forte pour bénéficier d&rsquo;un index.. </p>
<p>En test, on peut savoir exactement si une opération est susceptible de verrouiller la table fille avec l&rsquo;<em>event</em> 10704  . C&rsquo;est important car il y a quelques cas particuliers (des bugs par exemple). au moindre doute, il faut donc tester avec votre version d&rsquo;Oracle, sur votre modèle de données.</p>
<p>En production, il faut réagir si on voit des <em>wait events</em> &lsquo;<code class="codecolorer text default"><span class="text">enq: TM</span></code>&lsquo; avec des verrous en mode 4 (Share) ou 5 (SSX). Même s&rsquo;ils sont anodins maintenant, ils seront bloquants un jour lorsqu&rsquo;il y aura plus de données ou plus d&rsquo;activité.</p>
<p>Enfin, il ne faut pas voir la nécessité d&rsquo;indexer certaines clés étrangères comme quelque chose de contraignant. Dans la plupart des cas l&rsquo;index en question est nécessaire pour des raisons de performance, pour que le <em>delete </em>n&rsquo;ait pas à faire un <em>full scan</em> de la table fille. Et le comportement d&rsquo;Oracle est alors plutôt performant: aucun verrou n&rsquo;est posé. Et cela depuis les plus anciennes version d&rsquo;Oracle.</p>
<p>Un dernier point: si vous pensez que le mieux est de ne pas déclarer les contraintes d&rsquo;intégrité référentielles en base de données, mais de les gérer au niveau de l&rsquo;application, alors vous aurez des problèmes dès que vous aurez plusieurs utilisateurs concurrents. Soit vous risquez d&rsquo;avoir une inconsistance de données, soit vous devrez verrouiller toute la table jusqu&rsquo;à la fin de la transaction. Car les mécanismes interne d&rsquo;Oracle que l&rsquo;on vient de voir (relâcher le verrou avant la fin de la transaction, ou utiliser le bloc d&rsquo;index pour voir les <em>insert </em>non commités) et qui sont très performants ne sont pas accessibles  par l&rsquo;application&#8230;</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Droit au but en lisant un rapport AWR ou Statspack, par Franck Pachot</title>
		<link>https://blog.developpez.com/pachot/droit_au_but_en_lisant_un_rapport_awr_ou/</link>
		<comments>https://blog.developpez.com/pachot/droit_au_but_en_lisant_un_rapport_awr_ou/#comments</comments>
		<pubDate>Wed, 18 May 2011 06:59:44 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[Articles]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Il n&#8217;a a pas eu beaucoup d&#8217;articles traduits ces derniers mois. Pour patienter, voici un lien sur une présentation: Interpreting AWR Report &#8211; Straight to the Goal en anglais, mais très visuel&#8230; C&#8217;est parfois difficile d&#8217;aborder un rapport AWR ou &#8230; <a href="https://blog.developpez.com/pachot/droit_au_but_en_lisant_un_rapport_awr_ou/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Il n&rsquo;a a pas eu beaucoup d&rsquo;articles traduits ces derniers mois. Pour patienter, voici un lien sur une présentation:<br />
<a href="http://prezi.com/glqm9zemzhup/interpreting-awr-report-straight-to-the-goal/">Interpreting AWR Report &#8211; Straight to the Goal</a> en anglais, mais très visuel&#8230;</p>
<p>C&rsquo;est parfois difficile d&rsquo;aborder un rapport AWR ou Statspack qui comprends 50 pages de statistiques, dont seulement quelques unes sont utiles dans un contexte donné. J&rsquo;ai vu plusieurs personnes qui ne savent pas vraiment par où commencer. Et sans une approche méthodique, c&rsquo;est facile de perdre du temps sur des choses qui ne feront pas gagner un un temps significatif dans l&rsquo;amélioration du temps de réponse.</p>
<p>Cette présentation montre une approche méthodique: en partant du temps passé en base de données (DB time) pour voir si le rapport est pertinent ou pas, puis en prenant les éléments du &lsquo;Top 5 events&rsquo; en montrant où aller chercher les détails qui permettent de comprendre la raison d&rsquo;un problème de performance, comment le résoudre, et estimer le gain en temps de réponse que peut apporter la résolution.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Unité de temps dans les vues V$</title>
		<link>https://blog.developpez.com/pachot/fp_time_unit/</link>
		<comments>https://blog.developpez.com/pachot/fp_time_unit/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 12:57:39 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[Articles]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Historiquement, les vues V$ collectent les durées en centisecondes (100ème de secondes). Cependant, certaines vues utilisent une autre unité: microsecondes (1000000ème de seconde): TIME_WAITED_MICRO, WAIT_TIME dans V$SESSION_WAIT, V$SYSTEM_EVENT, V$SESSION_EVENT, V$ACTIVE_SESSION_HISTORY CPU_TIME, ELAPSED_TIME dans V$SQL, V$SQLAREA WAIT_TIME dans V$LATCH, V$LATCH_PARENT, V$LATCH_CHILDREN &#8230; <a href="https://blog.developpez.com/pachot/fp_time_unit/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Historiquement, les vues V$ collectent les durées en centisecondes (100ème de secondes).<br />
Cependant, certaines vues utilisent une autre unité:</p>
<p><strong>microsecondes (1000000ème de seconde):</strong></p>
<p>TIME_WAITED_MICRO, WAIT_TIME dans V$SESSION_WAIT, V$SYSTEM_EVENT, V$SESSION_EVENT, V$ACTIVE_SESSION_HISTORY<br />
CPU_TIME, ELAPSED_TIME dans V$SQL, V$SQLAREA<br />
WAIT_TIME dans V$LATCH, V$LATCH_PARENT, V$LATCH_CHILDREN<br />
ACTIVE_TIME dans V$SQL_WORKAREA, V$SQL_WORKAREA_ACTIVE</p>
<p><strong>millisecondes (1000ème de seconde):</strong></p>
<p>CPU_WAIT_TIME dans V$ENQUEUE_STAT</p>
<p><strong>secondes:</strong></p>
<p>CTIME dans V$LOCK</p>
<p>La liste est non exhaustive, et les commentaires sont bienvenus pour la mettre à jour <img src="https://blog.developpez.com/pachot/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Opération INDEX JOIN (jointure entre indexes), par Franck Pachot</title>
		<link>https://blog.developpez.com/pachot/fp_index_join/</link>
		<comments>https://blog.developpez.com/pachot/fp_index_join/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 21:02:41 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[Articles]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[En général lorsqu&#8217;il y a plusieurs indexes qui peuvent répondre aux prédicats d&#8217;une requête, Oracle va choisir l&#8217;index le plus selectif, et les autres conditions seront vérifiées au moment d&#8217;aller lire l&#8217;enregistrement complet dans la table. Ceci peut nous amener &#8230; <a href="https://blog.developpez.com/pachot/fp_index_join/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>En général lorsqu&rsquo;il y a plusieurs indexes qui peuvent répondre aux prédicats d&rsquo;une requête, Oracle va choisir l&rsquo;index le plus selectif, et les autres conditions seront vérifiées au moment d&rsquo;aller lire l&rsquo;enregistrement complet dans la table.<br />
Ceci peut nous amener à créer un index concaténé, en combinant toutes les colonnes sur lesquelles il y a des prédicats, afin que l&rsquo;index soit plus sélectif. </p>
<p>Mais ajouter un index a un coût et va pénaliser les insert/deletes ainsi que les updates qui touchent aux colonnes indexées.</p>
<p>Il y a cependant des cas où Oracle peut combiner deux indexes.<br />
C&rsquo;est le cas par exemple des indexes bitmap. On peut avoir un index bitmap sur chaque colonne, et Oracle va combiner les bitmaps avant d&rsquo;aller voir la table (en utilisant des opérateurs binaire AND et OR sur les bitmaps). Mais ce n&rsquo;est pas le sujet de cet article.</p>
<p>Il y a aussi un cas particulier avec les indexes &lsquo;normaux': c&rsquo;est le chemin d&rsquo;accès &lsquo;<strong>INDEX JOIN</strong>&lsquo;: les 2 indexes sont lus, et sont réunis, comme si l&rsquo;on faisait une jointure sur le rowid, et la sortie de cette opération est équivalente à un index qui contiendrait toutes les colonnes.</p>
<p>Voici un exemple de cette opération &lsquo;index join&rsquo;, le but de cet exemple était de répondre à la question suivante, sur le forum <a href="http://www.dba-village.com/village/dvp_forum.OpenThread?ThreadIdA=39900">dba-village</a>: &lsquo;<em>Que signifient les indexes index$_join$_9 et index$_join$_8&prime; dans un plan d&rsquo;exécution, et &lsquo;comment les remplacer par mes propres indexes ?</em>&lsquo;<br />
<span id="more-36"></span></p>
<p><i>Je commence par créer une table avec 2 colonnes (n1 et n2):</i></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">SQL&gt; create table t as &nbsp;<br />
&nbsp;select mod(rownum,10) n1 ,mod(rownum,8) n2 , lpad('x',1000,'x') x from dual connect by level &lt; 1000; <br />
Table created.</div></div>
<p><i>Et je crée un index sur chaque colonne:</i></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">SQL&gt; create index ti1 on t(n1); <br />
Index created. <br />
SQL&gt; create index ti2 on t(n2); <br />
Index created.</div></div>
<p><i>Je met autotrace à &lsquo;trace explain&rsquo; pour afficher le plan d&rsquo;exécution, mais pas le résultat:</i></p>
<p><code class="codecolorer text default"><span class="text">SQL&gt; set autotrace trace explain</span></code></p>
<p><i>et je lance un select avec des prédicats sur n2 et n2:</i></p>
<p><code class="codecolorer text default"><span class="text">SQL&gt; select n1,n2 from t where n2 is not null and n1=3;</span></code></p>
<pre>

<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">------------------------------------------------------------------------------------------- <br />
| Id &nbsp;| Operation &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| Name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | Rows &nbsp;| Bytes | Cost (%CPU)| Time &nbsp; &nbsp; | <br />
------------------------------------------------------------------------------------------- <br />
| &nbsp; 0 | SELECT STATEMENT &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp;97 | &nbsp;2522 | &nbsp; &nbsp; 3 &nbsp;(34)| 00:00:01 | <br />
|* &nbsp;1 | &nbsp;VIEW &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| index$_join$_001 | &nbsp; &nbsp;97 | &nbsp;2522 | &nbsp; &nbsp; 3 &nbsp;(34)| 00:00:01 | <br />
|* &nbsp;2 | &nbsp; HASH JOIN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| <br />
|* &nbsp;3 | &nbsp; &nbsp;INDEX RANGE SCAN &nbsp; &nbsp;| TI1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp;97 | &nbsp;2522 | &nbsp; &nbsp; 1 &nbsp; (0)| 00:00:01 | <br />
|* &nbsp;4 | &nbsp; &nbsp;INDEX FAST FULL SCAN| TI2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp;97 | &nbsp;2522 | &nbsp; &nbsp; 1 &nbsp; (0)| 00:00:01 | <br />
-------------------------------------------------------------------------------------------&gt; <br />
Predicate Information (identified by operation id): <br />
--------------------------------------------------- <br />
&nbsp; &nbsp;1 - filter(&quot;N2&quot; IS NOT NULL AND &quot;N1&quot;=3) <br />
&nbsp; &nbsp;2 - access(ROWID=ROWID) <br />
&nbsp; &nbsp;3 - access(&quot;N1&quot;=3) <br />
&nbsp; &nbsp;4 - filter(&quot;N2&quot; IS NOT NULL)</div></div>

</pre>
<p>On peut voir la jointure sur les indexes:</p>
<ul>
<li>(3) un RANGE SCAN  de l&rsquo;index TI1 pour avoir les ROWID qui vérifient le prédicat <code class="codecolorer text default"><span class="text">n1=3</span></code>. <br />Le résultat est mis en table de hachage pour le HASH JOIN</li>
<li>(4) un FULL SCAN de l&rsquo;index TI2 pour avoir les ROWID qui vérifient le prédicat <code class="codecolorer text default"><span class="text">n2 is not null</span></code></li>
<li>(2) un HASH join de ce résulat avec le premier. On voit la condition de jointure <code class="codecolorer text default"><span class="text">ROWID=ROWID</span></code></li>
<li>(1) Le résultat de cette opération, appelé <code class="codecolorer text default"><span class="text">index$_join$_001</span></code>, a les colonnes ROWID, N1 et N2, exactement comme si on avait un index concaténé sur (N1,N2)</li>
</ul>
<p><i>Mainenant, je crée un index similaire:</i></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">SQL&gt; create index ti12 on t(n1,n2); <br />
Index created.</div></div>
<p><i>Et j&rsquo;exécute la même requête:</i></p>
<p><code class="codecolorer text default"><span class="text">SQL&gt; select n1,n2 from t where n2 is not null and n1=3;</span></code></p>
<pre>

<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">------------------------------------------------------------------------- <br />
| Id &nbsp;| Operation &nbsp; &nbsp; &nbsp; &nbsp;| Name | Rows &nbsp;| Bytes | Cost (%CPU)| Time &nbsp; &nbsp; | <br />
------------------------------------------------------------------------- <br />
| &nbsp; 0 | SELECT STATEMENT | &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp;97 | &nbsp;2522 | &nbsp; &nbsp; 2 &nbsp; (0)| 00:00:01 | <br />
|* &nbsp;1 | &nbsp;INDEX RANGE SCAN| TI12 | &nbsp; &nbsp;97 | &nbsp;2522 | &nbsp; &nbsp; 2 &nbsp; (0)| 00:00:01 | <br />
------------------------------------------------------------------------- <br />
Predicate Information (identified by operation id): <br />
--------------------------------------------------- <br />
&nbsp; &nbsp;1 - access(&quot;N1&quot;=3) <br />
&nbsp; &nbsp; &nbsp; &nbsp;filter(&quot;N2&quot; IS NOT NULL)</div></div>

</pre>
<p>On voit alors que l&rsquo;index a été utilisé, et que le coût est un peu meilleur.<br />
Reste à voir si ce gain est justifié par rapport au coût d&rsquo;avoir une index supplémentaire à maintenir lors des inser/delete/update.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Description du mode de backup à chaud (BEGIN BACKUP), par Franck Pachot</title>
		<link>https://blog.developpez.com/pachot/fp_backup_mode/</link>
		<comments>https://blog.developpez.com/pachot/fp_backup_mode/#comments</comments>
		<pubDate>Mon, 03 May 2010 20:52:13 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[Articles]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce document tente d&#8217;expliquer exactement ce qui arrive lorsque vous utilisez ALTER TABLESPACE ... BEGIN BACKUP et ALTER TABLESPACE &#160;... &#160;END BACKUP, et pourquoi il est obligatoire de l&#8217;utiliser lorsque la sauvegarde à chaud se fait avec un outil qui &#8230; <a href="https://blog.developpez.com/pachot/fp_backup_mode/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Ce document tente d&rsquo;expliquer exactement ce qui arrive lorsque vous utilisez <code class="codecolorer text default"><span class="text">ALTER TABLESPACE ... BEGIN BACKUP</span></code> et <code class="codecolorer text default"><span class="text">ALTER TABLESPACE &nbsp;... &nbsp;END BACKUP</span></code>, et pourquoi il est obligatoire de l&rsquo;utiliser lorsque la sauvegarde à chaud se fait avec un outil qui est extérieur à Oracle (tels que les sauvegardes faites à partir de l&rsquo;OS utilisant cp, tar, la BCV, etc)<br />
 Il donne également une réponse aux questions suivantes, fréquemment posées:</p>
<ul>
<li>  Est-ce qu&rsquo; Oracle continue d&rsquo;écrire dans les fichiers (<i>datafiles</i>) lorsque la tablespace est en mode backup ? </li>
<li>  A quoi sert la commande <code class="codecolorer text default"><span class="text">ALTER DATABASE BEGIN BACKUP</span></code> ? </li>
<li>  Pourquoi le mode <i>backup</i> n&rsquo;est pas utilisé avec RMAN ? </li>
<li>  Que se passe-t-il si vous faites une sauvegarde sans avoir fait le BEGIN BACKUP ? </li>
<li>  Que faire si l&rsquo;instance se plante alors que vous êtes en mode backup ? </li>
<li>  Comment vérifier quels datafiles sont en mode backup ? </li>
<li>  Quels sont les archive logs minimum à garder avec la sauvegarde à chaud?
</li>
<li>  Pourquoi utiliser des backups par des commandes OS au lieu de RMAN?</li>
<li> Pourquoi la commande BEGIN BACKUP peut prendre du temps ?
</li>
</ul>
<p><span id="more-37"></span></p>
<h3>Sauvegarde offline (&lsquo;hors ligne&rsquo; ou &lsquo;à froid&rsquo;)</h3>
<p> Une sauvegarde à froid est très simple: la base de données a été arrêtée proprement (pas après le plantage de l&rsquo;instance, ni avec un shutdown abort) de sorte que:</p>
<ul>
<li> tous les datafiles sont cohérent (ils ont le même SCN) et aucun <i>redo</i> n&rsquo;est nécessaire en cas de restauration (d&rsquo;ailleurs, on ne sauvegarde pas les <em>redo</em> dans ce cas)
</li>
<li> les datafiles sont fermés (<i>offline</i>): ils ne seront pas mis à jour pendant l&rsquo;opération de copie </li>
</ul>
<p> Ainsi, le backup peut être restauré entièrement et la base de données ne peut être ouverte sans faire une récupération (<em>recovery</em>).</p>
<h3> Sauvegarde online (&lsquo;en ligne&rsquo; ou &lsquo;à chaud&rsquo;) </h3>
<p> Une sauvegarde à chaud effectue la copie des fichiers pendant que la base est ouverte. Cela signifie que la copie est incohérente et nécessitera d&rsquo;appliquer du <i>redo</i> pour être utilisable.<br />
Le <em>media recovery</em> est l&rsquo;opération qui consiste à appliquer les journaux (<i>redo</i> <i>log</i>) sur les fichiers restaurés afin de rejouer les modifications telles qu&rsquo;elles ont été faites dans les fichiers d&rsquo;origine.</p>
<p>Lorsque la copie est faite avec Oracle (RMAN), Oracle copie les blocs de données vers les <em>backupsets</em> de telle sorte qu&rsquo;il sera capable de les restaurer et de faire le recover dessus.</p>
<p> Mais lorsque la copie se fait à partir du système d&rsquo;exploitation (c&rsquo;est à dire avec un outil qui ne connaît pas la structure interne des fichier Oracle), plusieurs problèmes se posent:</p>
<ul>
<li><u>incohérence de l&rsquo;entête de fichier (header inconsistency)</u>: Rien garantit que les fichiers sont copiés du début vers la fin. Donc l&rsquo;entête du fichier peut refléter un état correspondant au début ou à la fin de la copie. </li>
<li><u>blocs fracturés (fractured blocks)</u>: Rien ne garantit qu&rsquo;un bloc Oracle est lu en un seul i/o, de sorte que deux moitiés d&rsquo;un bloc peuvent correspondre à deux moments différents. </li>
<li><u>cohérence de sauvegarde (backup consistency)</u>: Durant son exécution, la copie va lire des données qui correspondent à différents instants. Le recovery est capable de faire avancer l&rsquo;état d&rsquo;un block passé, mais ne peut pas faire revenir en arrière un bloc futur. Le recovery doit donc se poursuivre au moins jusqu&rsquo;au SCN de l&rsquo;instant de fin de la copie.
</li>
</ul>
<p> Donc, tout est lié à la cohérence de la copie: la cohérence entre les fichiers de données (datafiles), la cohérence à l&rsquo;intérieur de ces fichiers, et la cohérence au sein des blocs de données. Et il faut garder cette cohérence dans les fichiers courants de la base (évidemment) mais aussi dans la copie, le backup, puisqu&rsquo;elle sera nécessaire en cas de restauration.</p>
<h3> Mode BACKUP </h3>
<p> Le but de ALTER TABLESPACE &#8230; BEGIN BACKUP and ALTER TABLESPACE &#8230; END BACKUP est de prendre des mesures spéciales lors de l&rsquo;écriture dans les datafiles en cours afin de rendre leur copie utilisable, quelle que soit la manière dont la copie est faite, et ce sans affecter les opérations courantes.</p>
<p> Rien ne devrait être changé pour les fichiers courants, mais, comme la copie se fait par un outil externe, la seule façon d&rsquo;avoir quelque chose de spécial dans la copie est de le faire dans les fichiers courants, avant qu&rsquo;ils soient copiés, et de tout remettre en ordre à la fin.</p>
<p><b>L&rsquo;enjeu est d&rsquo;avoir une copie cohérente qui peut être récupérée par le recovery, sans avoir aucun contrôle sur le programme externe qui fait cette copie, et ce avec un impact minimum sur la base courante.</b></p>
<p> Afin de résoudre les 3 problèmes exposés ci-dessus, l&rsquo;instance qui fera le recovery doit savoir:</p>
<ul>
<li>que les fichiers ont besoin de recovery, à partir de quel moment (<a href="http://blog.developpez.com/pachot/p8681/concepts/scn/jl-glossary-scn/">SCN</a>) les redo sont à appliquer</li>
<li>comment réparer les blocs fracturés</li>
<li>et jusqu&rsquo;à quel SCN au minimum le recovery doit se faire</li>
</ul>
<p> Pendant le mode BACKUP, pour chaque datafile dans le tablespace en BEGIN BACKUP, voici ce qui se passe:</p>
<p><u>1 &#8211; Lorsque la commande BEGIN BACKUP est exécutée:</u></p>
<ul>
<li> Le flag de sauvegarde à chaud dans les en-têtes de fichier de données est défini, afin que la copie soit identifiée comme étant une copie de sauvegarde à chaud.<br />
 Il s&rsquo;agit de gérer la question de cohérence de sauvegarde lorsque la copie sera utilisée pour une reprise.
</li>
<li> Un checkpoint est lançé pour les fichiers du tablespace, afin qu&rsquo;il ne reste plus de modifications faites en mémoire et non encore écrites sur disque (dirty buffers).<br />
 La commande BEGIN BACKUP ne rends la main que lorsque ce checkpoint est terminé.
</li>
</ul>
<p><u>2 &#8211; Pendant le mode BACKUP:</u></p>
<ul>
<li> L&rsquo;en-tête des fichiers (datafile header) est figé, de sorte que la copie reflète l&rsquo;état du &lsquo;chackpoint SCN&rsquo; correspondant au début du backup.<br />
 Ainsi, quand la copie sera restaurée, Oracle saura qu&rsquo;il doit commencer le recovery à ce SCN pour applique les journaux archivés (archived logs).<br />
 C&rsquo;est pour résoudre le problème de l&rsquo;incohérence de l&rsquo;en-tête.<br />
 Cela signifie que les futurs checkpoints ne vont pas mettre à jour le SCN de l&rsquo;entête du fichier (mais ils ne mettre à jour un &lsquo;backup SCN&rsquo; quand même)
</li>
<li> Chaque première modification faite sur un bloc en mémoire (buffer cache) écrira le bloc complet dans les journaux (redo thread) alors que le comportement par défaut est d&rsquo;écrire seulement le vecteur de changement.<br />
 C&rsquo;est pour résoudre le problème des bloc fracturé. Il peut y avoir un bloc fracturé dans la copie, mais il sera remplacé en totalité lors du recovery. </li>
</ul>
<p><i>Cela signifie que tout se passe comme d&rsquo;habitude, sauf pour les deux opérations suivantes:</i><br />
<i> &#8211; Le checkpoint, qui ne change pas le SCN de l&rsquo;entête de fichier.</i><br />
<i> &#8211; La modification d&rsquo;un bloc, la première fois qu&rsquo;il est modifié depuis son entrée dans le cache, l&rsquo;image complète du bloc est enregistrée dans les journaux.</i><br />
<i> Les insert en mode direct (direct-path) ne passent pas par le buffer cache, mais de toute façon ils écrivent toujours des blocs entiers, donc le bloc entier se retrouve dans les journaux (si l&rsquo;on est pas en nologging)</i></p>
<p><u>3 &#8211; Lorsque la commande END BACKUP est exécutée:</u></p>
<ul>
<li> Un enregistrement de redo qui marque la fin du mode backup est écrit dans les journaux, de sorte que si la copie est restaurée, le recovery doit se poursuivre au moins jusqu&rsquo;à ce point. C&rsquo;est pour résoudre le problème de la cohérence du backup. </li>
<li> Le flag de sauvegarde à chaud dans les en-têtes datafile est remis à zéro. </li>
<li> Le SCN de l&rsquo;en-tête est mis à jour avec le SCN courant. </li>
</ul>
<p> Remarques :</p>
<ol>
<li> Le cas du bloc fracturé est rare, puisqu&rsquo;il n&rsquo;arrive que lorsque l&rsquo;io de la copie est fait en même temps que l&rsquo;i/o de l&rsquo;écriture. Mais le seul moyen d&rsquo;éviter le problème est de faire la journalisation du bloc entier pour chaque bloc qui risque d&rsquo;être écrit sur disque durant la copie, au cas où. </li>
<li> Si la taille de l&rsquo;I/O de la copie est multible de la taille du bloc Oracle (par exemple un backup fait avec <font class="Apple-style-span" face="courier new">bs = 1M dd),</font> cette journalisation supplémentaire ne semble pas nécessaire car le cas du bloc fracturé ne peut pas arriver.
</li>
<li> Le checkpoint du BEGIN BACKUP est indispensable pour couvrir tous les cas possibles de blocs fracturés. Sinon, il pourrait rester un dirty buffer modifié avant le begin backup (donc sans l&rsquo;image complète dans le redo) et qui pourrait être écrit sur disque en même temps que la copie. </li>
<li> Ce logging supplémentaire n&rsquo;est fait que lorsque le bloc est pour la première fois modifié depuis qu&rsquo;il est en buffer cache. Si le même bloc est rechargé à nouveau dans le buffer cache, le logging supplémentaire aura lieu à nouveau. Je n&rsquo;ai pas vu cela dans la documentation, mais un test en faisant un &lsquo;flush buffer_cache&rsquo; peut le prouver. </li>
</ol>
<h3> Conséquence sur la copie (le backup)</h3>
<p> Lorsque la copie a été fait entre <font class="Apple-style-span" face="courier new">begin backup</font> et le <font class="Apple-style-span" face="courier new">end backup,</font> la copie est entièrement disponible pour être restaurée (restore) et récupérée (recovery) à l&rsquo;aide des journaux archivés (archived logs) qui ont été générés depuis le <font class="Apple-style-span" face="courier new">begin backup</font>.<br />
 Une fois les fichiers restaurés, Oracle voit que le SCN est plus ancien que celui en cours et indique que la base de données a besoin de faire un recovery.</p>
<p> Le recovery doit se faire jusqu&rsquo;à un point ultérieur à la fin du backup, afin que nous soyons sûrs qu&rsquo;il n&rsquo;y a pas de blocs dans le fichier qui viennent du futur.</p>
<h3> Conséquence sur la base de données courante</h3>
<p> Toutes les opérations peuvent être effectuées pendant le mode de sauvegarde à chaud.<br />
 Toutefois, comme le redo généré est plus important, le backup doit être fait au cours d&rsquo;une période de faible activité. Et pour la même raison, il est préférable de sauvegarder les tablespaces les uns après les autres au lieu de les mettre tous en backup.</p>
<p> En outre, il n&rsquo;est pas possible d&rsquo;arrêter la base de données (shutdown) lorsqu&rsquo;un tablespace en mode backup.<br />
 C&rsquo;est parce que, comme l&rsquo;en-tête de datafile est figée avec un SCN ancien, le fichier serait considéré comme nécessitant un recovery.</p>
<p> Cependant, cela ne peut pas être évité en cas de plantage (ou de shutdown abort) et le démarrage de la base donnera le message suivant:<br />
     <font class="Apple-style-span" face="courier new">ORA-1113: le fichier &#8230; Nécessite une récupération</font><br />
 C&rsquo;est seul le cas que je connaisse où l&rsquo;<em>instance recovery</em> n&rsquo;est pas automatique, vous avez besoin de faire <font class="Apple-style-span" face="courier new">&lsquo;alter database &#8230; end backup;</font> &lsquo;avant d&rsquo;ouvrir la base de données.</p>
<h3> Questions fréquentes</h3>
<p><b> Est-ce qu&rsquo; Oracle continue d&rsquo;écrire dans les fichiers (datafiles) lorsque la tablespace est en mode backup ? </b><br />
 Oui, bien sûr, si ce n&rsquo;était pas le cas, on ne l&rsquo;appellerait pas &lsquo;sauvegarde en ligne&rsquo;.</p>
<p><b> A quoi sert la commande ALTER DATABASE BEGIN BACKUP ?</b><br />
 Cette commande met tous les tablespaces en mode backup.<br />
 On l&rsquo;a vu, c&rsquo;est une mauvaise pratique de mettre tous les tablespaces en mode backup, car il est préférable de minimiser la journalisation supplémentaire.</p>
<p> Oracle a introduit ce raccourci pour une seule raison: quand il s&rsquo;agit de faire un backup en utilisant le mirroring de la baie (BCV, FlashCopy, etc), cette copie concerne tous les fichiers en même temps, et elle ne dure que quelques secondes. Dans ce cas, il est plus facile d&rsquo;utiliser cette commande pour mettre tous les tablespaces en mode de sauvegarde à chaud.</p>
<p><b> Pourquoi ce mode n&rsquo;est pas utilisé avec les sauvegardes RMAN ?</b><br />
 RMAN est un outil Oracle, qui connaît la structure de fichiers, et la façon dont ils sont écrits.<br />
 Il sait donc comment lire les fichiers de sorte que la copie soit cohérente: écrire la bonne version de l&rsquo;en-tête du fichier, lire les blocs avec un I/O dont la taille est multiple de la taille du bloc Oracle afin qu&rsquo;il n&rsquo;y ait pas de blocs fracturés , et vérifier le début et la fin du bloc pour détecter s&rsquo;il es fracturé (dans ce cas, il relit le bloc pour obtenir une image cohérente).</p>
<p> C&rsquo;est un des avantages parmi tant d&rsquo;autres de l&rsquo;utilisation de RMAN pour les sauvegardes.</p>
<p><b> Que faire si vous faites une sauvegarde en ligne sans mettre les tablespaces en mode de sauvegarde?</b><br />
 Si vous ne mettez pas le tablespace en mode backup, vous n&rsquo;êtes pas certains que la copie est récupérable. C&rsquo;est peut être le cas, mais la copie peut aussi être incohérente.</p>
<p> On peut supposer que la copie est cohérente, si elle est effectuée dans les conditions suivantes</p>
<ul>
<li> incompatibilité en-tête: Si la copie de fichiers se fait du début à la fin, alors l&rsquo;en-tête devrait refléter le bon SCN
</li>
<li> blocs fracturés: Si la copie se fait avec des I/O dont la taille est multiple de la taille du bloc Oracle, alors vous ne devriez pas avoir de blocs fracturés
</li>
<li> La cohérence de sauvegarde: Si vous prenez soin de poursuivre le recovery au delà du point où la copie s&rsquo;est terminée, vous ne devriez pas avoir incohérence
</li>
</ul>
<p> Mais il peut y avoir d&rsquo;autres mécanismes internes qui ne sont pas documentées, de sorte que nous ne pouvons pas être sûrs que cette liste est exhaustive.<br />
 Et, comme ce n&rsquo;est pas supporté, nous ne pouvons pas compter sur une sauvegarde faite comme ça. Notez que vous n&rsquo;aurez pas de message d&rsquo;erreur.</p>
<p><b> Que faire si l&rsquo;instance plante alors que les tablespaces est en mode de sauvegarde à chaud ? </b><br />
 Lorsque vous démarrez la base de données après le crash, Oracle va signaler qu&rsquo;il faut faire un recovery. C&rsquo;est parce que le SCN a été gelé, et c&rsquo;est le comportement nécessaire: si vous restaurez le fichier copié, il devra être récupéré, et la seule façon pour Oracle de faire cela est d&rsquo;agir sur le fichier courant afin que ce soit reflété sur la copie.</p>
<p> Dans ce cas, vous pouvez simplement faire:</p>
<pre style="margin-left:40px">ALTER DATABASE END BACKUP; ALTER DATABASE OPEN;</pre>
<p> pour ouvrir la base de données. </p>
<p> Mais la sauvegarde n&rsquo;est pas utilisable, il faut le faire de nouveau.
</p>
<p><b> Comment faire pour vérifier si les datafiles sont en mode de sauvegarde </b></p>
<p> La vue V$BACKUP montre les datafiles qui sont actuellement en mode de sauvegarde (status=&rsquo;ACTIVE&rsquo;). </p>
<p> Certains anciens documents parlent de la colonne FUZZY de V$DATAFILE_HEADER.
</p>
<p> C&rsquo;est parce que dans les versions précédentes (&lt;9i) le begin backup mets à zéro le <i>online fuzzy bit</i> dans l&rsquo;en-tête fichier, et le remet à &lsquo;fuzzy&rsquo; lors du end backup. </p>
<p> Depuis 9i, le <i>online fuzzy bit</i> n&rsquo;est mis à zéro que lorsque fichier de données est offline ou en lecture seule (read-only), et non pas pour le mode de sauvegarde à chaud.
</p>
<p><b> Quels sont les archive logs minimum à garder avec la sauvegarde à chaud? </b><br />
 La sauvegarde en ligne est inutilisable s&rsquo;il n&rsquo;y a pas au moins la possibilité de restaurer les journaux d&rsquo;archivage:<br />
  &#8211; à partir du journal qui était le journal courant (<em>current redo log</em>) lorsque la sauvegarde a commencé,<br />
  &#8211; jusqu&rsquo;au journal qui a été archivé juste après que la sauvegarde complète ai été terminée.</p>
<p> Cela suffit pour faire une récupération incomplète (<em>incomplete media recovery</em>) jusqu&rsquo;au point qui correspond au moment de la fin de la sauvegarde.<br />
 Les archivelog suivants seront nécessaires pour amener la base jusqu&rsquo;au point le plus proche du moment de la panne.</p>
<p><b> Pourquoi utiliser les sauvegardes OS au lieu de RMAN</b></p>
<p> La meilleure façon de faire des sauvegardes en ligne est d&rsquo;utiliser RMAN qui a de nombreuses de fonctionnalités que vous ne pouvez pas avoir avec les sauvegardes OS. </p>
</p>
<p> Pourtant, la sauvegarde OS sont encore utile lors de l&rsquo;utilisation des outils OS qui peuvent copier une base de données entière en quelques secondes, en utilisant un split de miroir (BCV, FlashCopy, etc), pour des bases de données très volumineuses.
</p>
<p><b>Pourquoi la commande BEGIN BACKUP peut prendre du temps?</b><br />
BEGIN BACKUP doit faire un checkpoint des blocs de la tablespace concernée qui ont été modifiés en mémoire (dirty buffers) , de sorte qu&rsquo;il n&rsquo;y ait pas d&rsquo;écriture que ne soit protégée par la journalisation supplémentaire.<br />
La durée de ce checkpoint est proportionnelle à la taille du buffer cache et du nombre de datafiles.<br />
La performance de BEGIN BACKUP a été améliorée dans 10g.</p>
<h3>Références (en Anglais)</h3>
<ul>
<li><a href="http://www.speakeasy.org/%7Ejwilton/oracle/hot-backup.html" title="Idée reçue: le mode de sauvegarde à chaud cesse d'écrire pour les fichiers de données (Jérémie Wilton)">Idée reçue: le mode de sauvegarde à chaud cesse d&rsquo;écrire dans les fichiers de données (Jérémie Wilton)</a>
</li>
<li><a href="https://metalink.oracle.com/metalink/plsql/ml2_documents.showDocument?p_database_id=NOT&amp;p_id=1050932.6" title="Note MetaLink: 1050932,6 «Pourquoi Datafiles en cours d'écriture cours de la sauvegarde à chaud?">Note MetaLink: 1050932,6 «Pourquoi les datafiles sont toujours en cours d&rsquo;écriture durant une sauvegarde à chaud ?</a></li>
<li><a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:271815712711" title="AskTom &quot;Sauvegarde et restauration - pourquoi refaire supplémentaire est généré.&quot;">AskTom &laquo;&nbsp;Sauvegarde et restauration &#8211; pourquoi du redo supplémentaire est-il généré.&nbsp;&raquo;</a></li>
</ul>
<blockquote><p><ins>L&rsquo;article original en anglais se trouve <a href="http://knol.google.com/k/oracle-begin-backup-end-backup">ici</a>. Il date de la version Oracle 10gR2 </ins></p></blockquote>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
