<?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; exadata</title>
	<atom:link href="https://blog.developpez.com/pachot/tag/exadata/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>Exadata STORAGE FULL FIRST ROWS &#8211; bug ?</title>
		<link>https://blog.developpez.com/pachot/exadata_first_rows/</link>
		<comments>https://blog.developpez.com/pachot/exadata_first_rows/#comments</comments>
		<pubDate>Wed, 16 Oct 2013 22:34:13 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[MicroLearning]]></category>
		<category><![CDATA[exadata]]></category>
		<category><![CDATA[first rows]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=846</guid>
		<description><![CDATA[Une question sur le forum montre une mauvaise performance de la requête suivante: SELECT * FROM ( SELECT ... FROM ... WHERE condition_booleene = 'N' -- prédicat très selectif ORDER BY ... ) WHERE rownum &#60; :variable Exadata choisit un &#8230; <a href="https://blog.developpez.com/pachot/exadata_first_rows/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Une <a href="http://www.developpez.net/forums/d1384177/bases-donnees/oracle/sql/non-utilisation-d-index-optimiseur/#post7528199">question </a>sur le forum montre une mauvaise performance de la requête suivante:</p>
<pre>SELECT * FROM (
   SELECT ... FROM ...
   WHERE condition_booleene = 'N' -- prédicat très selectif
   ORDER BY ...
) WHERE rownum &lt; :variable</pre>
<p>Exadata choisit un Smart Scan mais c&rsquo;est long. Un index range scan est plus rapide même si l&rsquo;index ne correspond pas à l&rsquo;ordre de l&rsquo;ORDER BY.<br />
C&rsquo;est bien sûr étonnant car cest le cas idéal du SmartScan: besoin de lire toute la table mais prédicat très selectif pour predicate offloading.</p>
<p>Lorsqu&rsquo;on utilise <em>rownum &lt; :variable</em> l&rsquo;optimiseur passe en mode FIRST_ROWS, ce qui est logique puisqu&rsquo;on ne va chercher que les premières lignes.<br />
Mais Exadata fait une optimisation lorsqu&rsquo;il sait qu&rsquo;il va chercher peu de lignes: il ne démarre pas tout de suite en SmartScan car l&rsquo;établissement d&rsquo;une session SmartScan a un certain overhead et n&rsquo;est pas justifié pour lire quelques lignes seulement. Il ne passe en SmartScan que s&rsquo;il n&rsquo;a pas trouvé rapidement ce qu&rsquo;il cherchait.</p>
<p>Mais dans le cas présenté ici, avec l&rsquo;ORDER BY, ça n&rsquo;a pas de sens. Comme on fait un FULL SCAN, qui ne renvoit les lignes sans aucun ordre, il faudra lire toutes les lignes et les trier avant de pouvoir sortir les quelques premières. Et le tri ne se fait pas sur le Storage Cell. tout doit être renvoyé à la base. En bref, FIRST ROWS est un effet de bord du rownum, mais il n&rsquo;est pas bon ici puisque il empêche le SmartScan de démarrer tout de suite. C&rsquo;est probablement pourquoi l&rsquo;accès par index est plus rapide. Si on ne fait pas de SmartScan, alors autant bénéficier d&rsquo;un index, du buffer cache, et de flash cache&#8230;</p>
<p>Pour répondre à cette question du forum, j&rsquo;ai fait un test sur une table de 32MB (lorsqu&rsquo;elle est plus grosse, l&rsquo;effet se voit moins) en faisant un:</p>
<pre>select /*+ gather_plan_statistics */ * from (
  select * from TEST order by n 
) where rownum&lt;=10</pre>
<p>en désactivant cette fonctionnalité &lsquo;FIRST ROWS&rsquo; avec le paramètre <em>_kcfis_fast_response_enabled</em> dont la description est &lsquo;Enable smart scan optimization for fast response (first rows)&rsquo;, puis avec l&rsquo;environnement par défaut.</p>
<p>avec <strong>_kcfis_fast_response_enabled=false</strong>, les 4000 blocs de ma table sont lus:</p>
<pre>-------------------------------------------------------------------------------------------------------------------
| Id  | Operation                               | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
-------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |      |      1 |        |     10 |00:00:00.20 |    4019 |   4017 |
|*  1 |  COUNT STOPKEY                          |      |      1 |        |     10 |00:00:00.20 |    4019 |   4017 |
|   2 |   VIEW                                  |      |      1 |   1000K|     10 |00:00:00.20 |    4019 |   4017 |
|*  3 |    SORT ORDER BY STOPKEY                |      |      1 |   1000K|     10 |00:00:00.20 |    4019 |   4017 |
|*  4 |     TABLE ACCESS STORAGE FULL FIRST ROWS| TEST |      1 |   1000K|   1000K|00:00:00.13 |    4019 |   4017 |
-------------------------------------------------------------------------------------------------------------------
</pre>
<p>avec <strong>_kcfis_fast_response_enabled=true (défaut)</strong> seulement la moitié:</p>
<pre>-------------------------------------------------------------------------------------------------------------------
| Id  | Operation                               | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
-------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                        |      |      1 |        |     10 |00:00:00.21 |    2137 |   2135 |
|*  1 |  COUNT STOPKEY                          |      |      1 |        |     10 |00:00:00.21 |    2137 |   2135 |
|   2 |   VIEW                                  |      |      1 |   1000K|     10 |00:00:00.21 |    2137 |   2135 |
|*  3 |    SORT ORDER BY STOPKEY                |      |      1 |   1000K|     10 |00:00:00.21 |    2137 |   2135 |
|*  4 |     TABLE ACCESS STORAGE FULL FIRST ROWS| TEST |      1 |   1000K|   1000K|00:00:00.12 |    2137 |   2135 |
-------------------------------------------------------------------------------------------------------------------
</pre>
<p>Ça semble formidable &#8230; mais c&rsquo;est impossible: on sait bien qu&rsquo;il faut tout lire avant de pouvoir donner une réponse correcte.<br />
En fait, c&rsquo;est juste que Oracle a oublié de compter les blocs qu&rsquo;il a lu avant de faire le SmartScan&#8230; ceux qui ont été lus de manière beaucoup moins efficace&#8230;</p>
<p>On comprend mieux sur les stats suivantes.</p>
<p>avec <strong>_kcfis_fast_response_enabled=false</strong>:</p>
<pre>NAME                                                                                VALUE
---------------------------------------------------------------- ------------------------
cell IO uncompressed bytes                                                     33,120,256
cell blocks processed by cache layer                                                5,913
cell blocks processed by data layer                                                 4,043
cell blocks processed by txn layer                                                  5,913
cell physical IO bytes eligible for predicate offload                          32,915,456
cell physical IO interconnect bytes                                            29,833,624
cell physical IO interconnect bytes returned by smart scan                     29,825,432
cell scans                                                                              2
physical read bytes                                                            32,923,648
physical read total bytes                                                      32,923,648
</pre>
<p>On a 32MB à lire, et c&rsquo;est ce qu&rsquo;on fait. Dans mon cas, pas de prédicat ni projection, donc presque tout est renvoyé par SmartScan.</p>
<p>avec <strong>_kcfis_fast_response_enabled=true (défaut)</strong>:</p>
<pre>NAME                                                                                VALUE
---------------------------------------------------------------- ------------------------
cell IO uncompressed bytes                                                     17,596,416
cell blocks processed by cache layer                                                3,329
cell blocks processed by data layer                                                 2,148
cell blocks processed by txn layer                                                  3,329
cell num fast response sessions                                                         1
cell num fast response sessions continuing to smart scan                                1
cell physical IO bytes eligible for predicate offload                          17,498,112
cell physical IO interconnect bytes                                            31,273,680
cell physical IO interconnect bytes returned by smart scan                     15,848,144
cell scans                                                                              2
physical read bytes                                                            17,506,304
physical read total bytes                                                      32,923,648
</pre>
<p>On a seulement 17MB éligibles au SmartScan. Le reste a été lu sans SmartScan, au début de l&rsquo;exécution, à cause du mode FIRST_ROWS (<em>cell num fast response sessions</em>), avant de passer en SmartScan (<em>cell num fast response sessions continuing to smart scan</em>).<br />
Et malheureusement, les premières lectures ne sont pas comptées là où il faut: elles devraient être inclues dans &lsquo;<em>physical read bytes</em>&lsquo; et bien sûr dans les stats du plan d&rsquo;exécution. </p>
<p>D&rsquo;après les wait events, ces premières lectures étaient mono-bloc: &lsquo;cell single block physical read&rsquo;. C&rsquo;est la raison pour laquelle elles sont plus lentes (c&rsquo;est l&rsquo;equivalent Exadata de db file sequential read).</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
