<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5625177420526016054</id><updated>2012-02-15T09:08:58.999-03:00</updated><category term='Oracle Transparent Gateways'/><category term='optimizacion Consultas SQL'/><category term='Copia Base de datos'/><category term='Oracle XE'/><category term='Tunning'/><category term='Logminer'/><category term='ASH'/><category term='11g'/><category term='Tablas Particionadas'/><category term='Oracle Tips'/><title type='text'>-. Blog Fernando Valenzuela  .-</title><subtitle type='html'>This blog is for help to people</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-4297323765173027938</id><published>2009-10-28T13:50:00.002-03:00</published><updated>2009-10-28T14:11:02.523-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle XE'/><title type='text'>Cambia Puerto http del EM  de Oracle XE - (XE: Changing the default http port )</title><content type='html'>Determinas la configuracion actual setea en tu Oracle XE. Se accede mediante SQLPLUS con usuario SYSTEM (o cualquier otro con privilegios de DBA):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;C:\WINDOWS\system32&gt;sqlplus system@xe&lt;br /&gt;&lt;br /&gt;SQL*Plus: Release 10.1.0.2.0 - Production on Mi Jan 25 11:44:33 2006&lt;br /&gt;&lt;br /&gt;Copyright (c) 1982, 2004, Oracle.  All rights reserved.&lt;br /&gt;&lt;br /&gt;Enter password:&lt;br /&gt;&lt;br /&gt;Connected to:&lt;br /&gt;Oracle Database 10g Express Edition Release 10.2.0.1.0 - Beta&lt;br /&gt;&lt;br /&gt;SQL&gt; -- get current status&lt;br /&gt;SQL&gt; select dbms_xdb.gethttpport as "HTTP-Port"&lt;br /&gt;           , dbms_xdb.getftpport as "FTP-Port" from dual;&lt;br /&gt;&lt;br /&gt;HTTP-Port   FTP-Port&lt;br /&gt;---------- ----------&lt;br /&gt;    8080          0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div id="result_box" dir="ltr"&gt;Tu puedes cambiar el puerto HTTP y el puerto de FTP cuando quieras solo ten algunas precausiones tales como&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tener en cuenta que se necesita privilegios especiales para los puertos &lt;1024&gt;&lt;li&gt;debes chequear los puertos utilizados (&lt;span style="font-weight: bold;"&gt;netstat -ano&lt;/span&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Que  el parametro del httpport define el puerto que correra el EM.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL&gt; -- set http port and ftp port&lt;br /&gt;SQL&gt; begin&lt;br /&gt;2    &lt;span style="font-weight: bold;"&gt;dbms_xdb.sethttpport('80');&lt;/span&gt;  --El valor 80 es el nuevo parametro&lt;br /&gt;3    &lt;span style="font-weight: bold;"&gt;dbms_xdb.setftpport('2100')&lt;/span&gt;; --El valor 80 es el nuevo parametro&lt;br /&gt;4  end;&lt;br /&gt;5  /&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; select dbms_xdb.gethttpport as "HTTP-Port"&lt;br /&gt;           , dbms_xdb.getftpport as "FTP-Port" from dual;&lt;br /&gt;&lt;br /&gt;HTTP-Port   FTP-Port&lt;br /&gt;---------- ----------&lt;br /&gt;      80       2100&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div id="result_box" dir="ltr"&gt;Si sólo deseas utilizar la base de datos sin permitir el acceso a través de HTTP o FTP, puedes deshabilitar estas opciones de la siguiente manera:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL&gt; -- disable http and ftp access&lt;br /&gt;SQL&gt; begin&lt;br /&gt;2    dbms_xdb.sethttpport('0');&lt;br /&gt;3    dbms_xdb.setftpport('0');&lt;br /&gt;4  end;&lt;br /&gt;5  /&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; -- get current status&lt;br /&gt;SQL&gt; select dbms_xdb.gethttpport as "HTTP-Port"&lt;br /&gt;           , dbms_xdb.getftpport as "FTP-Port" from dual;&lt;br /&gt;&lt;br /&gt;HTTP-Port   FTP-Port&lt;br /&gt;---------- ----------&lt;br /&gt;       0          0&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-4297323765173027938?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/4297323765173027938/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=4297323765173027938' title='11 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/4297323765173027938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/4297323765173027938'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/10/cambia-puerto-http-del-em-de-oracle-xe.html' title='Cambia Puerto http del EM  de Oracle XE - (XE: Changing the default http port )'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-7364833730812300763</id><published>2009-10-27T08:52:00.000-03:00</published><updated>2009-10-27T08:53:09.229-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='optimizacion Consultas SQL'/><title type='text'>BULK COLLECT con miles de registros y la cláusula LIMIT</title><content type='html'>&lt;div class="post hentry"&gt; &lt;a name="5330851060867062364"&gt;&lt;/a&gt; &lt;h3 class="post-title entry-title"&gt; &lt;a href="http://lhorikian.blogspot.com/2007/09/bulk-collect-con-miles-de-registros-y.html"&gt;&lt;br /&gt;&lt;/a&gt; &lt;/h3&gt;  &lt;div class="post-body entry-content"&gt; Veo muchísimas veces, que cuando se utiliza BULK COLLECT en los códigos PL/SQL, no se coloca la cláusula LIMIT. Cuando no utilizamos ésta cláusula, lo único que ganamos es arruinar la memoria del proceso.&lt;br /&gt;La cláusula LIMIT nos permite definir la cantidad de 'datos' que vamos a colocar en memoria. Cuando utilizamos LIMIT, lo ideal es definirlo en un valor entre 100 a 500. Personalmente, elijo el valor 100 porque en base a mi experiencia suele ser el mejor valor. Pero porque elijo un valor tan chico y no 1000 o 5000 por ejemplo? Bueno, por la simple razón que manejar gran cantidad de datos en memoria es más costoso que manejar poca cantidad.&lt;br /&gt;Si elegimos un valor alto en el LIMIT, puede darse 3 casos:&lt;br /&gt;- Que nuestro código se ejecute más rápidamente (improbable).&lt;br /&gt;- Que nuestro código se ejecute en igual tiempo (improbable).&lt;br /&gt;- Que nuestro código se ejecute más lentamente (probable).&lt;br /&gt;&lt;br /&gt;Veamos un ejemplo para entender mejor las consecuencia de no utilizar la cláusula LIMIT.&lt;br /&gt;&lt;br /&gt;Primero creamos una tabla TEST con 10.000 registros (para ver la diferencia del uso de la cláusula LIMIT, no hace falta realizar el ejemplo con millones de registros. Con unos miles de registros nos alcanza para entender el tema) y una tabla TEST_2 con la estructura de la tabla TEST pero sin registros:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL_9iR2&gt; CREATE TABLE test AS&lt;br /&gt; 2  SELECT level id , 'oracle_'||level texto&lt;br /&gt; 3  FROM dual&lt;br /&gt; 4  CONNECT BY level &lt;= 10000 ;&lt;br /&gt;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;SQL_9iR2&gt; CREATE TABLE test_2 AS&lt;br /&gt; 2  SELECT *&lt;br /&gt; 3  FROM test&lt;br /&gt; 4  WHERE 1 = 2 ;&lt;br /&gt;&lt;br /&gt;Table created.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Antes de ejecutar el primer código, voy a liberar la memoria que ya no se está utilizando en mi sesión actual para poder ver claramente la diferencia de las estadísticas tomadas en cada ejecución.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL_9iR2&gt; exec dbms_session.FREE_UNUSED_USER_MEMORY ;&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ejecutamos un código PL/SQL con Bulk Collect pero SIN la cláusula LIMIT:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL_9iR2&gt; DECLARE&lt;br /&gt; 2  TYPE t_array_number   IS TABLE OF NUMBER ;&lt;br /&gt; 3  TYPE t_array_varchar2 IS TABLE OF VARCHAR2(50) ;&lt;br /&gt; 4  t_array_id     t_array_number ;&lt;br /&gt; 5  t_array_texto  t_array_varchar2 ;&lt;br /&gt; 6  CURSOR cur IS&lt;br /&gt; 7      SELECT * FROM test ;&lt;br /&gt; 8  BEGIN&lt;br /&gt; 9      OPEN cur ;&lt;br /&gt;10      LOOP&lt;br /&gt;11&lt;br /&gt;12      FETCH cur BULK COLLECT INTO t_array_id , t_array_texto ;&lt;br /&gt;13&lt;br /&gt;14      FORALL i IN 1 .. t_array_id.COUNT&lt;br /&gt;15          INSERT INTO test_2&lt;br /&gt;16          VALUES (t_array_id(i) , t_array_texto(i)) ;&lt;br /&gt;17&lt;br /&gt;18      EXIT WHEN cur%NOTFOUND ;&lt;br /&gt;19&lt;br /&gt;20      END LOOP ;&lt;br /&gt;21      COMMIT ;&lt;br /&gt;22      CLOSE cur ;&lt;br /&gt;23  END ;&lt;br /&gt;24  /&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;Elapsed: 00:00:00.04&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Antes de ejecutar el segundo código, voy a liberar nuevamente la memoria que ya no se está utilizando en mi sesión actual.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL_9iR2&gt; exec dbms_session.FREE_UNUSED_USER_MEMORY ;&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ahora ejecutamos el mismo código PL/SQL con Bulk Collect pero CON la cláusula LIMIT:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL_9iR2&gt; DECLARE&lt;br /&gt; 2  TYPE t_array_number   IS TABLE OF NUMBER ;&lt;br /&gt; 3  TYPE t_array_varchar2 IS TABLE OF VARCHAR2(50) ;&lt;br /&gt; 4  t_array_id     t_array_number ;&lt;br /&gt; 5  t_array_texto  t_array_varchar2 ;&lt;br /&gt; 6  CURSOR cur IS&lt;br /&gt; 7      SELECT * FROM test ;&lt;br /&gt; 8  BEGIN&lt;br /&gt; 9      OPEN cur ;&lt;br /&gt;10      LOOP&lt;br /&gt;11&lt;br /&gt;12      FETCH cur BULK COLLECT INTO t_array_id , t_array_texto &lt;span style="font-weight: bold;"&gt;LIMIT 100&lt;/span&gt; ;&lt;br /&gt;13&lt;br /&gt;14      FORALL i IN 1 .. t_array_id.COUNT&lt;br /&gt;15          INSERT INTO test_2&lt;br /&gt;16          VALUES (t_array_id(i) , t_array_texto(i)) ;&lt;br /&gt;17&lt;br /&gt;18      EXIT WHEN cur%NOTFOUND ;&lt;br /&gt;19&lt;br /&gt;20      END LOOP ;&lt;br /&gt;21      COMMIT ;&lt;br /&gt;22      CLOSE cur ;&lt;br /&gt;23  END ;&lt;br /&gt;24  /&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;Elapsed: 00:00:00.04&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Podemos ver que en la segunda ejecución, estoy cargando en memoria 100 registros en cada Fetch que realizo. A diferencia de la primer ejecución, que carga todos los datos de una vez.&lt;br /&gt;&lt;br /&gt;Veamos las estadísticas obtenidas de las 2 ejecuciones anteriores:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Nombre                         Ejecución_1 Ejecución_2  Diferencia&lt;br /&gt;------------------------------ ----------- ----------- -----------&lt;br /&gt;LATCH.kwqit: protect wakeup ti           1           0          -1&lt;br /&gt;LATCH.simulator lru latch                1           0          -1&lt;br /&gt;LATCH.spilled msgs queues list           1           0          -1&lt;br /&gt;LATCH.transaction allocation             3           0          -3&lt;br /&gt;LATCH.session timer                      5           0          -5&lt;br /&gt;LATCH.multiblock read objects            8           0          -8&lt;br /&gt;LATCH.channel operations paren          11           0         -11&lt;br /&gt;LATCH.child cursor hash table           20           8         -12&lt;br /&gt;LATCH.Consistent RBA                    56           6         -50&lt;br /&gt;LATCH.lgwr LWN SCN                      56           6         -50&lt;br /&gt;LATCH.mostly latch-free SCN             56           6         -50&lt;br /&gt;LATCH.active checkpoint queue           63           7         -56&lt;br /&gt;LATCH.session idle bit                 183          45        -138&lt;br /&gt;LATCH.enqueues                         219          49        -170&lt;br /&gt;LATCH.redo writing                     241          25        -216&lt;br /&gt;LATCH.SQL memory manager worka         337           0        -337&lt;br /&gt;LATCH.messages                         427          42        -385&lt;br /&gt;LATCH.simulator hash latch             844           4        -840&lt;br /&gt;LATCH.dml lock allocation            1,428         154      -1,274&lt;br /&gt;LATCH.shared pool                    1,586         271      -1,315&lt;br /&gt;LATCH.row cache enqueue latch        1,648         194      -1,454&lt;br /&gt;LATCH.cache buffers lru chain        1,521           5      -1,516&lt;br /&gt;LATCH.library cache pin alloca       2,900         362      -2,538&lt;br /&gt;LATCH.row cache objects              4,438         502      -3,936&lt;br /&gt;LATCH.enqueue hash chains            4,841         508      -4,333&lt;br /&gt;LATCH.checkpoint queue latch         6,296         521      -5,775&lt;br /&gt;LATCH.session allocation            19,333       1,893     -17,440&lt;br /&gt;LATCH.undo global data              30,208       2,945     -27,263&lt;br /&gt;LATCH.redo allocation               30,716       3,231     -27,485&lt;br /&gt;LATCH.sequence cache                42,506       4,124     -38,382&lt;br /&gt;LATCH.library cache pin             60,580       6,241     -54,339&lt;br /&gt;LATCH.library cache                 76,555       7,911     -68,644&lt;br /&gt;&lt;br /&gt;LATCHES:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Ejecución_1   Ejecución_2   Diferencia   Porcentaje&lt;br /&gt;    670,187        67,521     -602,666      992.56%&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Una de las cosas que me interesa mostrarles acerca de éstas ejecuciones son los LATCHES (loqueos). Si bien la ejecución de los 2 códigos PL/SQL demoraron exactamente lo mismo en ejecutarse (en éste ejemplo procesando solamente 10.000 registros), las estadísticas nos muestran que estamos empleados muchísimos más loqueos en la primer ejecución que en la segunda. Pero porqué sucede ésto? Recordemos que en la segunda ejecución, lo único que modificamos en el código fue el agregado de la cláusula LIMIT. Bien, como dijimos en el comienzo, manejar gran cantidad de memoria es más costoso que manejar poca cantidad, por lo que Oracle tiene que emplear mayor cantidad de loqueos para manejar los 10.000 registros que subimos a memoria en la primer ejecución, que manejar solamente 100 registros en la segunda ejecución.&lt;br /&gt;Este ejemplo lo realizamos con un sólo usuario concurrente.... pero imagínese qué sucedería si tenemos muchos usuarios concurrentes realizando lo mismo que nosotros... y por lo tanto, generando gran cantidad de loqueos....&lt;br /&gt;&lt;br /&gt;NOTA: Tenemos que evitar los loqueos a toda costa ya que los loqueos afectan la performance del sistema. Mientras mayor sea la cantidad de loqueos, nuestro sistema se vuelve cada vez menos escalable; y como consecuencia, cada vez soporta menor cantidad de usuarios concurrentes. &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-7364833730812300763?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/7364833730812300763/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=7364833730812300763' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/7364833730812300763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/7364833730812300763'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/10/bulk-collect-con-miles-de-registros-y.html' title='BULK COLLECT con miles de registros y la cláusula LIMIT'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-1798563203734346488</id><published>2009-10-27T08:50:00.001-03:00</published><updated>2009-10-27T08:54:43.264-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tablas Particionadas'/><title type='text'>Tablas Particionadas - Comando ' EXCHANGE '</title><content type='html'>&lt;div class="post hentry"&gt; &lt;a name="9146087600416776061"&gt;&lt;/a&gt; &lt;h3 class="post-title entry-title"&gt; &lt;a href="http://lhorikian.blogspot.com/2007/09/exchange-partition.html"&gt;&lt;br /&gt;&lt;/a&gt; &lt;/h3&gt;  &lt;div class="post-body entry-content"&gt; &lt;span style="font-weight: bold; font-family: georgia; color: rgb(51, 0, 153);font-size:130%;" &gt;Exchange Partition &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Exchange Partition permite cargar en tablas particionadas datos en forma rápida y con muy poco impacto para los usuarios que se encuentran activos.&lt;br /&gt;En resumen, lo que hace la sentencia Exchange Partition es modificar el diccionario de datos y simular que los datos que ya tenemos cargados en una tabla, corresponden a una partición determinada de otra tabla.&lt;br /&gt;&lt;br /&gt;Veamos un ejemplo muy sencillo para entender mejor éste tema:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL_10gR2&gt; CREATE TABLE datos_1 AS&lt;br /&gt;2  SELECT level id, timestamp'2000-11-02 09:00:00' fecha&lt;br /&gt;3  FROM dual&lt;br /&gt;4  CONNECT BY level &lt;= 100000 ;  Table created.  Elapsed: 00:00:01.06  SQL_10gR2&gt; CREATE TABLE datos_2 AS&lt;br /&gt;2  SELECT level id, timestamp'2001-09-10 13:00:00' fecha&lt;br /&gt;3  FROM dual&lt;br /&gt;4  CONNECT BY level &lt;= 100000 ;  Table created. &lt;/pre&gt;&lt;br /&gt;Lo que hicimos fue crear 2 tablas con distintas fechas en cada una de ellas.&lt;br /&gt;&lt;br /&gt;Ahora creamos solamente la estructura de la tabla particionada en donde vamos a cargar los datos:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL_10gR2&gt; CREATE TABLE test&lt;br /&gt;2  ( id, fecha )&lt;br /&gt;3  PARTITION BY RANGE ( fecha )&lt;br /&gt;4  (&lt;br /&gt;5      PARTITION year_2000 VALUES LESS THAN ( timestamp'2000-12-02 00:00:00' ),&lt;br /&gt;6      PARTITION year_2001 VALUES LESS THAN ( timestamp'2001-10-10 00:00:00' )&lt;br /&gt;7  )&lt;br /&gt;8  AS&lt;br /&gt;9  SELECT 1, timestamp'2000-11-02 09:00:00'&lt;br /&gt;10  FROM dual&lt;br /&gt;11  WHERE 1 = 0 ;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Vamos a realizar un alter para modificar el diccionario de datos y relacionar cada una de las 2 tablas que creamos con la respectiva partición de la tabla TEST...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL_10gR2&gt; ALTER TABLE test&lt;br /&gt;2  &lt;span style="font-weight: bold;"&gt;EXCHANGE PARTITION&lt;/span&gt; year_2000&lt;br /&gt;3  WITH table datos_1&lt;br /&gt;4  &lt;span style="font-weight: bold;"&gt;WITHOUT VALIDATION&lt;/span&gt; ;&lt;br /&gt;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Elapsed: 00:00:00.03&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SQL_10gR2&gt; ALTER TABLE test&lt;br /&gt;2  &lt;span style="font-weight: bold;"&gt;EXCHANGE PARTITION&lt;/span&gt; year_2001&lt;br /&gt;3  WITH table datos_2&lt;br /&gt;4  &lt;span style="font-weight: bold;"&gt;WITHOUT VALIDATION&lt;/span&gt; ;&lt;br /&gt;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Elapsed: 00:00:00.02&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SQL_10gR2&gt; SELECT count(*)&lt;br /&gt;2  FROM test ;&lt;br /&gt;&lt;br /&gt;COUNT(*)&lt;br /&gt;----------&lt;br /&gt;  200000&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;br /&gt;&lt;br /&gt;SQL_10gR2&gt; SELECT count(*)&lt;br /&gt;2  FROM datos_1 ;&lt;br /&gt;&lt;br /&gt;COUNT(*)&lt;br /&gt;----------&lt;br /&gt;       0&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;br /&gt;&lt;br /&gt;SQL_10gR2&gt; SELECT count(*)&lt;br /&gt;2  FROM datos_2 ;&lt;br /&gt;&lt;br /&gt;COUNT(*)&lt;br /&gt;----------&lt;br /&gt;       0&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Como podemos ver, con el Exchange Partition no tardamos casi nada en cargar los datos en la tabla particionada ya que en realidad no estamos cargando los datos, simplemente se modifica el diccionario de datos.&lt;br /&gt;&lt;br /&gt;Pueden notar que agregué la sentencia WITHOUT VALIDATION. Que es ésto? WITHOUT VALIDATION suele ser una operación rápida porque sólo realiza modificaciones en el diccionario de datos. Si la tabla o tabla particionada que colocamos en el Exchange Partition tiene una primary key o unique constraint habilitado, entonces el Exchange Partition se realiza como WITH VALIDATION para mantener la integridad de las constraints.&lt;br /&gt;&lt;br /&gt;Vamos a ejecutar nuevamente los 2 alter anteriores sin la sentencia WITHOUT VALIDATION...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL_10gR2&gt; ALTER TABLE test&lt;br /&gt;2  &lt;span style="font-weight: bold;"&gt;EXCHANGE PARTITION&lt;/span&gt; year_2000&lt;br /&gt;3  WITH table datos_1 ;&lt;br /&gt;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Elapsed: 00:00:01.00&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SQL_10gR2&gt; ALTER TABLE test&lt;br /&gt;2  &lt;span style="font-weight: bold;"&gt;EXCHANGE PARTITION&lt;/span&gt; year_2001&lt;br /&gt;3  WITH table datos_2 ;&lt;br /&gt;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Elapsed: 00:00:01.05&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Si hubiera ejecutado esos alter con un Trace, el reporte del Trace me mostraría, entre otras sentencias, las siguientes...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;select 1&lt;br /&gt;from&lt;br /&gt;"DATOS_1" where TBL$OR$IDX$PART$NUM("TEST", 0, 3,1048576,"FECHA") != :1&lt;br /&gt;&lt;br /&gt;call     count       cpu    elapsed       disk      query    current        rows&lt;br /&gt;------- ------  -------- ---------- ---------- ---------- ----------  ----------&lt;br /&gt;Parse        1      0.00       0.00          0          0          0           0&lt;br /&gt;Execute      1      0.00       0.00          0          1          0           0&lt;br /&gt;Fetch        1      0.04       0.04          0         65          0           0&lt;br /&gt;------- ------  -------- ---------- ---------- ---------- ----------  ----------&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;total        3      0.04       0.04          0         66          0           0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Misses in library cache during parse: 1&lt;br /&gt;Misses in library cache during execute: 1&lt;br /&gt;Optimizer mode: ALL_ROWS&lt;br /&gt;Parsing user id: 81     (recursive depth: 1)&lt;br /&gt;&lt;br /&gt;Rows     Row Source Operation&lt;br /&gt;-------  ---------------------------------------------------&lt;br /&gt;    0  TABLE ACCESS FULL DATOS_1 (cr=65 pr=0 pw=0 time=44582 us)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;select 1&lt;br /&gt;from&lt;br /&gt;"DATOS_2" where TBL$OR$IDX$PART$NUM("TEST", 0, 3,1048576,"FECHA") != :1&lt;br /&gt;&lt;br /&gt;call     count       cpu    elapsed       disk      query    current        rows&lt;br /&gt;------- ------  -------- ---------- ---------- ---------- ----------  ----------&lt;br /&gt;Parse        1      0.00       0.00          0          0          0           0&lt;br /&gt;Execute      1      0.00       0.00          0          1          0           0&lt;br /&gt;Fetch        1      0.04       0.04          0         65          0           0&lt;br /&gt;------- ------  -------- ---------- ---------- ---------- ----------  ----------&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;total        3      0.04       0.04          0         66          0           0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Misses in library cache during parse: 1&lt;br /&gt;Misses in library cache during execute: 1&lt;br /&gt;Optimizer mode: ALL_ROWS&lt;br /&gt;Parsing user id: 81     (recursive depth: 1)&lt;br /&gt;&lt;br /&gt;Rows     Row Source Operation&lt;br /&gt;-------  ---------------------------------------------------&lt;br /&gt;    0  TABLE ACCESS FULL DATOS_2 (cr=65 pr=0 pw=0 time=46957 us)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Antes que nada, notamos que los alter se ejecutaron en mayor tiempo, cierto? De las consultas que observamos del Trace, vemos que se está realizando un FULL SCAN de las tablas y que se está ejecutando una función en el WHERE de cada consulta. Imagínense si tenemos que realizar ésta clase de procesos en ambientes con gran volumen de datos y en donde el sistema se encuentra saturado por el I/O a disco.&lt;br /&gt;&lt;br /&gt;Qué sucede si no tenemos los datos separados por año en distintas tablas, y en cambio, tenemos todos los datos en una misma tabla? Bueno, tomando como ejemplo la tabla TEST que acabamos de cargar, podríamos realizar lo siguiente...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL_10gR2&gt; CREATE TABLE test_2&lt;br /&gt;2  ( id, fecha )&lt;br /&gt;3  PARTITION BY RANGE ( fecha )&lt;br /&gt;4  (&lt;br /&gt;5      PARTITION year_2000 VALUES LESS THAN ( timestamp'2000-12-02 00:00:00' ),&lt;br /&gt;6      PARTITION year_2001 VALUES LESS THAN ( timestamp'2001-10-10 00:00:00' )&lt;br /&gt;7  )&lt;br /&gt;8  AS&lt;br /&gt;9  SELECT *&lt;br /&gt;10  FROM test ;&lt;br /&gt;&lt;br /&gt;Table created.&lt;br /&gt;&lt;br /&gt;Elapsed: 00:00:05.04&lt;br /&gt;&lt;br /&gt;SQL_10gR2&gt; DROP TABLE test ;&lt;br /&gt;&lt;br /&gt;Table dropped.&lt;br /&gt;&lt;br /&gt;SQL_10gR2&gt; ALTER TABLE test_2 RENAME TO test ;&lt;br /&gt;&lt;br /&gt;Table altered.&lt;br /&gt;&lt;br /&gt;SQL_10gR2&gt; SELECT count(*)&lt;br /&gt;2  FROM test ;&lt;br /&gt;&lt;br /&gt;COUNT(*)&lt;br /&gt;----------&lt;br /&gt;  200000&lt;br /&gt;&lt;br /&gt;1 row selected.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-1798563203734346488?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/1798563203734346488/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=1798563203734346488' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/1798563203734346488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/1798563203734346488'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/10/tablas-particionadas-comando-exchange.html' title='Tablas Particionadas - Comando &apos; EXCHANGE &apos;'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-165283200071073075</id><published>2009-09-16T16:10:00.001-04:00</published><updated>2009-09-16T16:10:54.945-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='11g'/><title type='text'>Oracle 11g R2 --- Liberado</title><content type='html'>&lt;p&gt;Despues de varios meses de pruebas, se libero el dia de hoy la version final del Oracle 11g R2 (11.2.0.1) para linux (32 y 64 bit), esta version trae mas de 200 nuevas mejoras destacando el nuevo ASM FileSystem, mejoras en comprension y mucho mas. Uds. podran encontrar mas informacion y bajar el software en:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.oracle.com/database/index.html"&gt;http://www.oracle.com/database/index.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Un gran saludos a todos,&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-165283200071073075?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/165283200071073075/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=165283200071073075' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/165283200071073075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/165283200071073075'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/09/oracle-11g-r2-liberado.html' title='Oracle 11g R2 --- Liberado'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-5421856531280640865</id><published>2009-08-31T12:21:00.000-04:00</published><updated>2009-08-31T12:22:35.221-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Copia Base de datos'/><title type='text'>Copiar una base de datos en Windows</title><content type='html'>La petición textual era &lt;b&gt;la creación de una base de datos igual que otra, pero con otro nombre&lt;/b&gt;. En algunos casos se trataba de replicar el entorno de producción para usarlo como test. En otros, simplemente, testear que el backup permitía recuperar la base de datos sobre otra máquina y dejar esa base de datos operativa como entorno auxiliar.&lt;br /&gt;&lt;br /&gt;Cuando la base de datos puede conservar el mismo nombre y mismo SID, es tan fácil como copiar datafiles, redolog, controlfiles y archivos ORA sobre los mismos directorios originales en una máquina con un servidor Oracle instalado&lt;i&gt;*&lt;/i&gt;.&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 75%;"&gt;&lt;i&gt;* Por supuesto, misma plataforma O.S., versión y release de Oracle.&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;No obstante, en los casos en los que el nombre debe ser diferente, hay que ser muy preciso con los pasos a seguir. Incluyo dos pasos previos como opcionales por si son de utilidad.&lt;br /&gt;&lt;br /&gt;En este ejemplo se asume que disponemos de la posibilidad de hacer un backup en frío de la base de datos.&lt;br /&gt;&lt;br /&gt;Pasos preliminares &lt;i&gt;(recomendado)&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;  - Backup frío, backup caliente, export, Transport Tablespaces, backup del backup, backup de todo lo posible.&lt;br /&gt;  - Reducción de tamaño de los datafiles. (Tom Kyte tiene un fabuloso &lt;a href="http://asktom.oracle.com/pls/ask/f?p=4950:8:18042204448192323045::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:153612348067"&gt;script &lt;/a&gt; para ello). Y otra vez backup.&lt;br /&gt;&lt;br /&gt;Pasos a seguir:&lt;br /&gt;&lt;br /&gt;  1.- &lt;b&gt;Backup en frío de la BBDD original&lt;/b&gt;&lt;br /&gt;  2.- Generación del pfile para la nueva BBDD&lt;br /&gt;  3.- Edición del pfile para sustituir: CONTROL_FILES, DB_NAME, y carpetas _DUMP_DEST,...&lt;br /&gt;  4.- Definir el nuevo ORACLE_SID&lt;br /&gt;  5.- Crear el nuevo servicio.&lt;br /&gt;  6.- Creación del fichero de passwords &lt;i&gt;(sólo si el pfile tiene REMOTE_LOGIN_PASSWORDFILE=exclusive)&lt;/i&gt;&lt;br /&gt;  7.- Conexión a sqlplus como SYSDBA&lt;br /&gt;  8.- Arranque de la instancia y creación del fichero de parámetros SPFILE&lt;br /&gt;  9.- Backup del controlfile de la BBDD original a traza&lt;br /&gt;  10.- Recreación del controlfile con la cláusula &lt;b&gt;SET NAME&lt;/b&gt;.&lt;br /&gt;  11.- Abrir la base de datos con modo &lt;b&gt;OPEN RESETLOGS&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.- Backup en frío de la BBDD original.&lt;br /&gt;    Restauración del backup sobre nueva ubicación.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;-- Ejecutar el resultado de la siguiente sentencia como script.&lt;br /&gt;-- NOTA: cuidado con los nombres duplicados de fichero.&lt;br /&gt;-------------------------------------------------------------&lt;br /&gt;select 'shutdown immediate;' from dual&lt;br /&gt;union all&lt;br /&gt;select 'host copy '||name||' &amp;amp;&amp;amp;directorio_destino' from v$controlfile&lt;br /&gt;union all&lt;br /&gt;select 'host copy '||member||' &amp;amp;directorio_destino' from v$logfile&lt;br /&gt;union all&lt;br /&gt;select 'host copy '||name||' &amp;amp;directorio_destino' from v$datafile&lt;br /&gt;union all&lt;br /&gt;select 'startup' from dual;&lt;br /&gt;&lt;br /&gt;-- copia de los ficheros a los directorios destino&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.- Generación del pfile para la nueva base de datos&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;SQL&gt; create pfile='?\admin\sid\pfile\inittest.ora' from spfile;&lt;br /&gt;&lt;br /&gt;Archivo creado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.- Edición del pfile para sustituir: CONTROL_FILES, DB_NAME, y carpetas _DUMP_DEST,...&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.- Definir el nuevo ORACLE_SID&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    c:\&gt;set ORACLE_SID=test&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.- Crear el nuevo servicio.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    c:\&gt;oradim -NEW -SRVC OracleServicetest  -startmode auto&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6.- Creación del fichero de passwords&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    c:\&gt;orapwd file=C:\orant\ora92\database\PWDtest.ora password=xxxxxxxxx&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;7.- Conexión a sqlplus como SYSDBA&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    C:\&gt;sqlplus&lt;br /&gt;&lt;br /&gt;    SQL*Plus: Release 9.2.0.6.0 - Production on Vie Jul 29 16:41:22 2005&lt;br /&gt;&lt;br /&gt;    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.&lt;br /&gt;&lt;br /&gt;    Introduzca el nombre de usuario: sys/xxxxxxxxxx as sysdba&lt;br /&gt;    Conectado a una instancia inactiva.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;8.- Arranque de la instancia y creación del fichero de parámetros SPFILE&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    SQL&gt; STARTUP NOMOUNT PFILE='C:\DIRECTORIO_DESTINO\inittest.ora'&lt;br /&gt;    Instancia ORACLE iniciada.&lt;br /&gt;&lt;br /&gt;    Total System Global Area 1074866044 bytes&lt;br /&gt;    Fixed Size                   456572 bytes&lt;br /&gt;    Variable Size             905969664 bytes&lt;br /&gt;    Database Buffers          167772160 bytes&lt;br /&gt;    Redo Buffers                 667648 bytes&lt;br /&gt;    SQL&gt; create spfile from pfile='C:\DIRECTORIO_DESTINO\inittest.ora';&lt;br /&gt;&lt;br /&gt;    Archivo creado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;9.- Backup del controlfile de PROD a trace.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    SQL&gt; alter database backup controlfile to trace;&lt;br /&gt;&lt;br /&gt;    Base de datos modificada.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;10.- A partir de la traza del fichero de control.&lt;/b&gt;&lt;br /&gt;     Recreación del controlfile con el SET NAME al nuevo nombre.&lt;br /&gt;&lt;br /&gt;     CREATE CONTROLFILE &lt;b&gt;SET DATABASE "TEST" RESETLOGS&lt;/b&gt;  NOARCHIVELOG REUSE&lt;br /&gt;        MAXLOGFILES 50&lt;br /&gt;        MAXLOGMEMBERS 5&lt;br /&gt;        MAXDATAFILES 133&lt;br /&gt;        MAXINSTANCES 1&lt;br /&gt;        MAXLOGHISTORY 453&lt;br /&gt;     LOGFILE&lt;br /&gt;       GROUP 2 'C:\DATA\TEST\REDO\REDO02.LOG'  SIZE 100M,&lt;br /&gt;       GROUP 3 'C:\DATA\TEST\REDO\REDO03.LOG'  SIZE 100M,&lt;br /&gt;       GROUP 4 'C:\DATA\TEST\REDO\REDO04.LOG'  SIZE 150M,&lt;br /&gt;       GROUP 5 'C:\DATA\TEST\REDO\REDO05.LOG'  SIZE 150M,&lt;br /&gt;       GROUP 6 'C:\DATA\TEST\REDO\REDO06.LOG'  SIZE 200M&lt;br /&gt;      -- STANDBY LOGFILE&lt;br /&gt;     DATAFILE&lt;br /&gt;        &lt;i&gt;(... ficheros...)&lt;/i&gt;&lt;br /&gt;        'C:\DATA\TEST\SYSTEM\SYSTEM01.DBF',&lt;br /&gt;        'C:\DATA\TEST\DATA\DATA01.DBF'&lt;br /&gt;     CHARACTER SET WE8MSWIN1252&lt;br /&gt;     ;&lt;br /&gt;&lt;br /&gt;     Archivo de control creado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;11.- Abrir la base de datos con modo OPEN RESETLOGS.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;     SQL&gt; alter database open resetlogs;&lt;br /&gt;&lt;br /&gt;     Base de datos modificada.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;12.- Verificación.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;     SQL&gt; select instance_name from v$instance;&lt;br /&gt;&lt;br /&gt;     INSTANCE_NAME&lt;br /&gt;     ----------------&lt;br /&gt;     test&lt;br /&gt;&lt;br /&gt;     SQL&gt; select name from v$database;&lt;br /&gt;&lt;br /&gt;     NAME&lt;br /&gt;     ---------&lt;br /&gt;     TEST&lt;br /&gt;&lt;br /&gt;     SQL&gt; select status from v$thread;&lt;br /&gt;&lt;br /&gt;     STATUS&lt;br /&gt;     ------&lt;br /&gt;     OPEN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;12.- Shutdown y Open de la base de datos.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;     SQL&gt; shutdown immediate;&lt;br /&gt;     Base de datos cerrada.&lt;br /&gt;     Base de datos desmontada.&lt;br /&gt;     Instancia ORACLE cerrada.&lt;br /&gt;&lt;br /&gt;     SQL&gt; startup&lt;br /&gt;     Instancia ORACLE iniciada.&lt;br /&gt;&lt;br /&gt;     Total System Global Area 1074866044 bytes&lt;br /&gt;     Fixed Size                   456572 bytes&lt;br /&gt;     Variable Size             905969664 bytes&lt;br /&gt;     Database Buffers          167772160 bytes&lt;br /&gt;     Redo Buffers                 667648 bytes&lt;br /&gt;     Base de datos montada.&lt;br /&gt;     Base de datos abierta.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-5421856531280640865?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/5421856531280640865/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=5421856531280640865' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/5421856531280640865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/5421856531280640865'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/08/copiar-una-base-de-datos-en-windows.html' title='Copiar una base de datos en Windows'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-8270423191635748816</id><published>2009-08-31T11:52:00.001-04:00</published><updated>2009-08-31T11:52:55.704-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Logminer'/><title type='text'>Uso de logminer</title><content type='html'>&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;En alguna ocasión he necesitado recuperar una transacción validada con COMMIT, pero no deseada o errónea. Pongo un ejemplo:&lt;br /&gt;&lt;br /&gt;- Usuario borra una fila.&lt;br /&gt;- Por accidente.&lt;br /&gt;- No sabe de qué fila se trata, pero 'algo' ha dicho "registro borrado".&lt;br /&gt;- &lt;i&gt;(...borrado y validado)&lt;/i&gt;.&lt;br /&gt;- Ni idea de qué datos tenía la fila.&lt;br /&gt;- Ni él, ni nadie.&lt;br /&gt;- Desde ese momento, la fila X ha desaparecido sin rastro.&lt;br /&gt;&lt;br /&gt;Con variaciones, éste caso es bastante frecuente, y si el usuario que ha borrado el registro es lo suficientemente rápido, existe una posibilidad de recuperar los datos perdidos.&lt;br /&gt;&lt;br /&gt;Generalmente, todas las transacciones convencionales procesan la información pasando por las áreas de redo log. En estos archivos está toda la información correspondiente al nuevo cambio. Oracle basa toda su actividad en el buen funcionamiento del registro de redo log y, por tanto, en esta área únicamente almacena los datos físicos elementales para rehacer la operación. Por tanto, no se almacena información sobre los valores anteriores.&lt;br /&gt;&lt;br /&gt;Lo cual sí sucede en el área de rollback, y ¡la gestión de rollback también pasa por redolog!.&lt;br /&gt;&lt;br /&gt;Oracle dispone de un paquete, el LOG MINER que permite rastrear los redo logs (online y archivados) junto con la información de rollback disponible también en éstos. Una vez ejecutado el paquete que crea el fichero de diccionario de objetos, Oracle es capaz de interpretar esos redologs y mostrar información tan válida como el SQL generado y el SQL inverso para "reparar" la acción.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%;"&gt;&lt;br /&gt;SQL&gt; connect / as sysdba&lt;br /&gt;Conectado.&lt;br /&gt;SQL&gt; show parameters utl&lt;br /&gt;&lt;br /&gt;NAME                                 TYPE        VALUE&lt;br /&gt;------------------------------------ ----------- ------------------------------&lt;br /&gt;&lt;b&gt;utl_file_dir                         string      c:\oraclefiles&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;SQL&gt; &lt;b&gt;exec DBMS_LOGMNR_D.BUILD( DICTIONARY_FILENAME =&gt;'dictionary.ora', DICTIONARY_LOCATION =&gt; 'c:\oraclefiles');&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Procedimiento PL/SQL terminado correctamente.&lt;br /&gt;&lt;br /&gt;SQL&gt; select member from v$logfile;&lt;br /&gt;&lt;br /&gt;MEMBER&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;C:\ORACLE\ORADATA\ORCL\REDO04A.LOG&lt;br /&gt;C:\ORACLE\ORADATA\ORCL\REDO04B.LOG&lt;br /&gt;C:\ORACLE\ORADATA\ORCL\REDO05A.LOG&lt;br /&gt;C:\ORACLE\ORADATA\ORCL\REDO05B.LOG&lt;br /&gt;C:\ORACLE\ORADATA\ORCL\REDO06A.LOG&lt;br /&gt;C:\ORACLE\ORADATA\ORCL\REDO06B.LOG&lt;br /&gt;&lt;br /&gt;6 filas seleccionadas.&lt;br /&gt;&lt;br /&gt;SQL&gt; &lt;b&gt;exec DBMS_LOGMNR.add_logfile('C:\ORACLE\ORADATA\ORCL\REDO04A.LOG');&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Procedimiento PL/SQL terminado correctamente.&lt;br /&gt;&lt;br /&gt;SQL&gt; &lt;b&gt;exec DBMS_LOGMNR.add_logfile('C:\ORACLE\ORADATA\ORCL\REDO05A.LOG');&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Procedimiento PL/SQL terminado correctamente.&lt;br /&gt;&lt;br /&gt;SQL&gt; &lt;b&gt;exec DBMS_LOGMNR.add_logfile('C:\ORACLE\ORADATA\ORCL\REDO06A.LOG');&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Procedimiento PL/SQL terminado correctamente.&lt;br /&gt;&lt;br /&gt;SQL&gt; &lt;b&gt;EXECUTE DBMS_LOGMNR.START_LOGMNR(DICTFILENAME =&gt;'c:\oraclefiles\dictionary.ora');&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Procedimiento PL/SQL terminado correctamente.&lt;br /&gt;&lt;br /&gt;SQL&gt; set pages 100&lt;br /&gt;SQL&gt; set lines 120&lt;br /&gt;SQL&gt; column sql_redo format a50&lt;br /&gt;SQL&gt; column sql_undo format a50&lt;br /&gt;&lt;br /&gt;SQL&gt; select sql_redo, sql_undo from &lt;b&gt;v$logmnr_contents&lt;/b&gt; where rownum&lt;10;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new; font-size: 80%;"&gt;&lt;br /&gt;SQL_REDO                                           SQL_UNDO&lt;br /&gt;-------------------------------------------------- --------------------------------------------------&lt;br /&gt;insert into "DISCOVERER9I"."EUL5_MV101651"("Import delete from "DISCOVERER9I"."EUL5_MV101651" where "&lt;br /&gt;e SUM","Importe COUNT","Importe MAX","Importe MIN" Importe SUM" = '170,01' and "Importe COUNT" = '1'&lt;br /&gt;,"Importe AVG","Ciudad","Pais","Rango Edad","Sexo" and "Importe MAX" = '170,01' and "Importe MIN" = '&lt;br /&gt;,"Detalle Vuelo") values ('170,01','1','170,01','1 170,01' and "Importe AVG" = '170,01' and "Ciudad"&lt;br /&gt;70,01','170,01','Madeira','Portugal','Mayores de 5 = 'Madeira' and "Pais" = 'Portugal' and "Rango Eda&lt;br /&gt;0 a±os','Mujer','VUELO52149');                     d" = 'Mayores de 50 a±os' and "Sexo" = 'Mujer' and&lt;br /&gt;                                                    "Detalle Vuelo" = 'VUELO52149' and ROWID = 'AAALV&lt;br /&gt;                                                   mAAPAAAAn8AAA';&lt;br /&gt;&lt;br /&gt;insert into "DISCOVERER9I"."EUL5_MV101651"("Import delete from "DISCOVERER9I"."EUL5_MV101651" where "&lt;br /&gt;e SUM","Importe COUNT","Importe MAX","Importe MIN" Importe SUM" = '112,95' and "Importe COUNT" = '1'&lt;br /&gt;,"Importe AVG","Ciudad","Pais","Rango Edad","Sexo" and "Importe MAX" = '112,95' and "Importe MIN" = '&lt;br /&gt;,"Detalle Vuelo") values ('112,95','1','112,95','1 112,95' and "Importe AVG" = '112,95' and "Ciudad"&lt;br /&gt;12,95','112,95','Madeira','Portugal','Mayores de 5 = 'Madeira' and "Pais" = 'Portugal' and "Rango Eda&lt;br /&gt;0 a±os','Mujer','VUELO52206');                     d" = 'Mayores de 50 a±os' and "Sexo" = 'Mujer' and&lt;br /&gt;                                                    "Detalle Vuelo" = 'VUELO52206' and ROWID = 'AAALV&lt;br /&gt;                                                   mAAPAAAAn8AAB';&lt;br /&gt;&lt;br /&gt;insert into "DISCOVERER9I"."EUL5_MV101651"("Import delete from "DISCOVERER9I"."EUL5_MV101651" where "&lt;br /&gt;e SUM","Importe COUNT","Importe MAX","Importe MIN" Importe SUM" = '123,29' and "Importe COUNT" = '1'&lt;br /&gt;,"Importe AVG","Ciudad","Pais","Rango Edad","Sexo" and "Importe MAX" = '123,29' and "Importe MIN" = '&lt;br /&gt;,"Detalle Vuelo") values ('123,29','1','123,29','1 123,29' and "Importe AVG" = '123,29' and "Ciudad"&lt;br /&gt;23,29','123,29','Madeira','Portugal','Mayores de 5 = 'Madeira' and "Pais" = 'Portugal' and "Rango Eda&lt;br /&gt;0 a±os','Mujer','VUELO52331');                     d" = 'Mayores de 50 a±os' and "Sexo" = 'Mujer' and&lt;br /&gt;                                                    "Detalle Vuelo" = 'VUELO52331' and ROWID = 'AAALV&lt;br /&gt;                                                   mAAPAAAAn8AAC';&lt;br /&gt;&lt;br /&gt;insert into "DISCOVERER9I"."EUL5_MV101651"("Import delete from "DISCOVERER9I"."EUL5_MV101651" where "&lt;br /&gt;e SUM","Importe COUNT","Importe MAX","Importe MIN" Importe SUM" = '178,55' and "Importe COUNT" = '1'&lt;br /&gt;,"Importe AVG","Ciudad","Pais","Rango Edad","Sexo" and "Importe MAX" = '178,55' and "Importe MIN" = '&lt;br /&gt;,"Detalle Vuelo") values ('178,55','1','178,55','1 178,55' and "Importe AVG" = '178,55' and "Ciudad"&lt;br /&gt;78,55','178,55','Madeira','Portugal','Mayores de 5 = 'Madeira' and "Pais" = 'Portugal' and "Rango Eda&lt;br /&gt;0 a±os','Mujer','VUELO52419');                     d" = 'Mayores de 50 a±os' and "Sexo" = 'Mujer' and&lt;br /&gt;                                                    "Detalle Vuelo" = 'VUELO52419' and ROWID = 'AAALV&lt;br /&gt;                                                   mAAPAAAAn8AAD';&lt;br /&gt;&lt;br /&gt;insert into "DISCOVERER9I"."EUL5_MV101651"("Import delete from "DISCOVERER9I"."EUL5_MV101651" where "&lt;br /&gt;e SUM","Importe COUNT","Importe MAX","Importe MIN" Importe SUM" = '107,36' and "Importe COUNT" = '1'&lt;br /&gt;,"Importe AVG","Ciudad","Pais","Rango Edad","Sexo" and "Importe MAX" = '107,36' and "Importe MIN" = '&lt;br /&gt;,"Detalle Vuelo") values ('107,36','1','107,36','1 107,36' and "Importe AVG" = '107,36' and "Ciudad"&lt;br /&gt;07,36','107,36','Madeira','Portugal','Mayores de 5 = 'Madeira' and "Pais" = 'Portugal' and "Rango Eda&lt;br /&gt;0 a±os','Mujer','VUELO52488');                     d" = 'Mayores de 50 a±os' and "Sexo" = 'Mujer' and&lt;br /&gt;                                                    "Detalle Vuelo" = 'VUELO52488' and ROWID = 'AAALV&lt;br /&gt;                                                   mAAPAAAAn8AAE';&lt;br /&gt;&lt;br /&gt;insert into "DISCOVERER9I"."EUL5_MV101651"("Import delete from "DISCOVERER9I"."EUL5_MV101651" where "&lt;br /&gt;e SUM","Importe COUNT","Importe MAX","Importe MIN" Importe SUM" = '120,5' and "Importe COUNT" = '1' a&lt;br /&gt;,"Importe AVG","Ciudad","Pais","Rango Edad","Sexo" nd "Importe MAX" = '120,5' and "Importe MIN" = '12&lt;br /&gt;,"Detalle Vuelo") values ('120,5','1','120,5','120 0,5' and "Importe AVG" = '120,5' and "Ciudad" = 'M&lt;br /&gt;,5','120,5','Madeira','Portugal','Mayores de 50 a± adeira' and "Pais" = 'Portugal' and "Rango Edad" =&lt;br /&gt;os','Mujer','VUELO52561');                          'Mayores de 50 a±os' and "Sexo" = 'Mujer' and "De&lt;br /&gt;                                                   talle Vuelo" = 'VUELO52561' and ROWID = 'AAALVmAAP&lt;br /&gt;                                                   AAAAn8AAF';&lt;br /&gt;&lt;br /&gt;insert into "DISCOVERER9I"."EUL5_MV101651"("Import delete from "DISCOVERER9I"."EUL5_MV101651" where "&lt;br /&gt;e SUM","Importe COUNT","Importe MAX","Importe MIN" Importe SUM" = '109,01' and "Importe COUNT" = '1'&lt;br /&gt;,"Importe AVG","Ciudad","Pais","Rango Edad","Sexo" and "Importe MAX" = '109,01' and "Importe MIN" = '&lt;br /&gt;,"Detalle Vuelo") values ('109,01','1','109,01','1 109,01' and "Importe AVG" = '109,01' and "Ciudad"&lt;br /&gt;09,01','109,01','Madeira','Portugal','Mayores de 5 = 'Madeira' and "Pais" = 'Portugal' and "Rango Eda&lt;br /&gt;0 a±os','Mujer','VUELO52690');                     d" = 'Mayores de 50 a±os' and "Sexo" = 'Mujer' and&lt;br /&gt;                                                    "Detalle Vuelo" = 'VUELO52690' and ROWID = 'AAALV&lt;br /&gt;                                                   mAAPAAAAn8AAG';&lt;br /&gt;&lt;br /&gt;insert into "DISCOVERER9I"."EUL5_MV101651"("Import delete from "DISCOVERER9I"."EUL5_MV101651" where "&lt;br /&gt;e SUM","Importe COUNT","Importe MAX","Importe MIN" Importe SUM" = '174,91' and "Importe COUNT" = '1'&lt;br /&gt;,"Importe AVG","Ciudad","Pais","Rango Edad","Sexo" and "Importe MAX" = '174,91' and "Importe MIN" = '&lt;br /&gt;,"Detalle Vuelo") values ('174,91','1','174,91','1 174,91' and "Importe AVG" = '174,91' and "Ciudad"&lt;br /&gt;74,91','174,91','Madeira','Portugal','Mayores de 5 = 'Madeira' and "Pais" = 'Portugal' and "Rango Eda&lt;br /&gt;0 a±os','Mujer','VUELO52693');                     d" = 'Mayores de 50 a±os' and "Sexo" = 'Mujer' and&lt;br /&gt;                                                    "Detalle Vuelo" = 'VUELO52693' and ROWID = 'AAALV&lt;br /&gt;                                                   mAAPAAAAn8AAH';&lt;br /&gt;&lt;br /&gt;insert into "DISCOVERER9I"."EUL5_MV101651"("Import delete from "DISCOVERER9I"."EUL5_MV101651" where "&lt;br /&gt;e SUM","Importe COUNT","Importe MAX","Importe MIN" Importe SUM" = '131,5' and "Importe COUNT" = '1' a&lt;br /&gt;,"Importe AVG","Ciudad","Pais","Rango Edad","Sexo" nd "Importe MAX" = '131,5' and "Importe MIN" = '13&lt;br /&gt;,"Detalle Vuelo") values ('131,5','1','131,5','131 1,5' and "Importe AVG" = '131,5' and "Ciudad" = 'M&lt;br /&gt;,5','131,5','Madeira','Portugal','Mayores de 50 a± adeira' and "Pais" = 'Portugal' and "Rango Edad" =&lt;br /&gt;os','Mujer','VUELO52951');                          'Mayores de 50 a±os' and "Sexo" = 'Mujer' and "De&lt;br /&gt;                                                   talle Vuelo" = 'VUELO52951' and ROWID = 'AAALVmAAP&lt;br /&gt;                                                   AAAAn8AAI';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;9 filas seleccionadas.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-8270423191635748816?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/8270423191635748816/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=8270423191635748816' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/8270423191635748816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/8270423191635748816'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/08/uso-de-logminer.html' title='Uso de logminer'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-2053498593199173975</id><published>2009-08-31T11:46:00.001-04:00</published><updated>2009-08-31T11:48:51.905-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle Transparent Gateways'/><title type='text'>Acceso a una bbdd MSAccess desde Oracle.</title><content type='html'>&lt;div style="text-align: justify;"&gt;Es posible acceder a bases de datos no oracle de forma transparente con &lt;span style="font-weight: bold;"&gt;Oracle Transparent Gateways&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Esta funcionalidad permite configurar una entrada DNS de ODBC como si se tratara de un servicio Oracle cualquiera. De este modo, mediante un dblink, un usuario podría acceder a una tabla de una base de datos access (o SQLServer o MySQL, por ejemplo) desde una query o desde PL/SQL.&lt;br /&gt;&lt;br /&gt;La arquitectura de servicios heterogeneos se basa en la siguiente configuración:&lt;br /&gt;&lt;br /&gt;Se especifica una entrada de TNS en el fichero &lt;span style="font-style: italic;"&gt;tnsnames.ora &lt;/span&gt;que resuelva una conexión al host, puerto y nombre de servicio determinado, con el parámetro &lt;span style="font-weight: bold;"&gt;HS=OK&lt;/span&gt; (Oracle Heterogeneous Services).&lt;br /&gt;&lt;br /&gt;Por otro lado, el listener destino tiene definido para ese servicio la invocación a un programa llamado "hsodbc" que, mediante un fichero de parámetros llamado init&lt;span style="font-style: italic;"&gt;&lt;sid_hs&gt;&lt;/sid_hs&gt;&lt;/span&gt;.ora accede al DNS asociado a la base de datos MSAccess concreta.&lt;br /&gt;&lt;br /&gt;De este modo, y creando un dblink, cualquier usuario podría hacer una select que cruzara datos de su esquema Oracle y de una bbdd Access.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PASOS A SEGUIR&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;1.- Instalar en el diccionario los servicios heterogeneos.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;2.- Configurar el tnsnames.ora &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;3.- Configurar el listener.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;4.- Comprobar que el listener y el tnsnames.ora funcionan correctamente.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;5.- Configurar el ODBC para la bbdd access.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;6.- Crear el DBLINK hacia la bbdd access.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;7.- Crear el fichero init&lt;sid_hs&gt;&lt;/sid_hs&gt;&lt;/span&gt;&lt;servicio_hs style="font-style: italic;"&gt;.ora &lt;/servicio_hs&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;8.- Ejecutar una consulta mediante ese dblink.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.- Instalar en el diccionario los servicios heterogeneos&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;@?/rdbms/admin/caths.sql&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NOTA: &lt;/span&gt;puede que estas vistas estén instaladas ya en la bbdd.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2.- Configurar el tnsnames.ora&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt; bbdd_access = &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;   (DESCRIPTION=&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;      (ADDRESS= (PROTOCOL=tcp) &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;               (HOST=&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;192.168.2.4&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;)&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;               (PORT=1521)&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;     )&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;     (CONNECT_DATA = &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;         (SERVICE_NAME=odbc_access)&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;     )&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;     (HS = OK)&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt; )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3.- Configurar el listener. (la entrada en negrita es la que hay que añadir)...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;LISTENER =&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;  (DESCRIPTION_LIST =&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;    (DESCRIPTION =&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;      (ADDRESS_LIST =&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;      )&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;      (ADDRESS_LIST =&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;         (ADDRESS = (PROTOCOL = TCP)(HOST = &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;192.168.2.4&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;)(PORT = 1521))&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;      )&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;    )&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;  )&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;SID_LIST_LISTENER =&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;   (SID_LIST =&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;    (SID_DESC =&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;       (SID_NAME = PLSExtProc)&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;      (ORACLE_HOME = D:\oracle\ora92)&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;      (PROGRAM = extproc)&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;    )&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;    (SID_DESC =&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;      (GLOBAL_DBNAME = orcl)&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;      (ORACLE_HOME = D:\oracle\ora92)&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;      (SID_NAME = orcl)&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;    )&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-family: courier new,monospace; font-size: 85%;"&gt;     (SID_DESC =&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-family: courier new,monospace; font-size: 85%;"&gt;      (ORACLE_HOME = D:\oracle\ora92)&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-family: courier new,monospace; font-size: 85%;"&gt;      (SID_NAME = odbc_access)&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-family: courier new,monospace; font-size: 85%;"&gt;       (PROGRAM = hsodbc)&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-family: courier new,monospace; font-size: 85%;"&gt;    )&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;  )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4.- Comprobar que el listener y el tnsnames.ora funciona correctamente. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;C:\Documents and Settings\Administrador&gt;&lt;span style="font-weight: bold;"&gt;tnsping bbdd_access&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;TNS Ping Utility for 32-bit Windows: Version 9.2.0.1.0 - Production on 08-SEP-2006 18:19:42&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;Copyright (c) 1997 Oracle Corporation.  All rights reserved.&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;Archivos de parßmetros utilizados:&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;D:\oracle\ora92\network\admin&lt;wbr&gt;\sqlnet.ora &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;Adaptador TNSNAMES utilizado para resolver el alias &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;Attempting to contact (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp)&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;(HOST=192.168.2.4)&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt; (PORT=1521)) (CONNECT_DATA = (SERVICE_NAME=odbc_access)) (HS &lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;= OK))&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;Realizado correctamente (50 mseg) &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5.- Configurar el ODBC para la bbdd access.&lt;/span&gt;&lt;br /&gt;La base de datos access utilizada en el ejemplo tiene una única tabla con cuatro filas de ejemplo...&lt;br /&gt;&lt;span style="font-family: courier new,monospace;"&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;create table ejemplo&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;   (id counter,&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;    valor text)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Es preciso crear un ODBC para acceder a la bbdd access determinada. Desde Windows esta opción se configura en Panel de control, Herramientas administrativas, Administrador ODBC y la pestaña DNS de sistema.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;desde ahí se crea el driver    odbc_access vinculado a la base de datos que uso: "test_hs.mdb" con esta tabla de ejemplo.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;NOTA: esta bbdd access tiene password "tesths"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6.- Crear el DBLINK hacia la bbdd access.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;SQL&gt; CREATE DATABASE LINK bbdd_access&lt;br /&gt;2      CONNECT TO ADMIN IDENTIFIED BY TESTHS&lt;br /&gt;3      USING 'bbdd_access';&lt;br /&gt;&lt;br /&gt;Enlace con la base de datos creado.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7.- Crear el fichero init&lt;servicio_hs&gt;&lt;/servicio_hs&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;sid_hs&gt;&lt;/sid_hs&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;servicio_hs&gt;.ora en el directorio de ORACLE_HOME   /hs/admin/&lt;/servicio_hs&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt; -- FICHERO initODBC_ACCESS.ora&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;#&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt; # HS init parameters&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;#&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;HS_FDS_CONNECT_INFO = odbc_access&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;HS_FDS_TRACE_LEVEL = 0&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;HS_FDS_TRACE_FILE_NAME = odbc_access.trc&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;HS_AUTOREGISTER = TRUE&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace;"&gt;&lt;envvar&gt;&lt;/envvar&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8.- Lanzar la query via ese dblink&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;SQL&gt; column "valor" format a40&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;SQL&gt; set pages 1000 &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;SQL&gt; set lines 120&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt; SQL&gt; select * from &lt;span style="font-weight: bold;"&gt;ejemplo@bbdd_access;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;        id valor&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;---------- ------------------------------&lt;wbr&gt;----------&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;         1 dato1&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;         2 dato2&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;         3 dato3&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace; font-size: 85%;"&gt;         4 dato4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-2053498593199173975?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/2053498593199173975/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=2053498593199173975' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/2053498593199173975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/2053498593199173975'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/08/acceso-una-bbdd-msaccess-desde-oracle.html' title='Acceso a una bbdd MSAccess desde Oracle.'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-2826729742053733670</id><published>2009-08-31T11:39:00.001-04:00</published><updated>2009-08-31T11:39:26.490-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='optimizacion Consultas SQL'/><title type='text'>Optimizacion de Consultas SQL en Oracle</title><content type='html'>&lt;span style="font-family: georgia;"&gt;&lt;span style="font-weight: bold;"&gt;La siguiente consulta tardaba 11 horas en ejecutarse.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;SELECT DISTINCT A.NODO_ID, B.NODO_B_ID NODO_EQ1&lt;br /&gt;FROM BITOWN03.BS_R_NODOS_BIT_03 A,&lt;br /&gt;         BITOWN03.RE_R_CONEX_EXTERNAS_BIT_03 B,&lt;br /&gt;         BITOWN03.TMP_NODOS_OK_EST_BIT_03 C&lt;br /&gt;WHERE A.NODO_ID = B.NODO_A_ID&lt;br /&gt;  AND B.NODO_B_ID = C.NODO_ID;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;con el siguiente plan de ejecución:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 78%;"&gt;SQL&gt; @c:\oracle\ora92\rdbms\admin\utlxpls&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;-----------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation              |  Name                    | Rows  | Bytes | Cost  |&lt;br /&gt;-----------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT       |                          |  5554 |   124K|    23 |&lt;br /&gt;|   1 |  SORT UNIQUE           |                          |  5554 |   124K|    23 |&lt;br /&gt;|   2 |   NESTED LOOPS         |                          |  5554 |   124K|     2 |&lt;br /&gt;|   3 |    MERGE JOIN CARTESIAN|                          |  5985M|    61G|     2 |&lt;br /&gt;|   4 |     TABLE ACCESS FULL  | TMP_NODOS_OK_EST_BIT_03  |  1327 |  6635 |     2 |&lt;br /&gt;|   5 |     BUFFER SORT        |                          |  4510K|    25M|       |&lt;br /&gt;|   6 |      INDEX FULL SCAN   | PK_R_NODOS_BIT_03        |  4510K|    25M|       |&lt;br /&gt;|*  7 |    INDEX RANGE SCAN    | IDX_NODO_CONEX_EXTERNA   |     1 |    12 |       |&lt;br /&gt;-----------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   7 - access("B"."NODO_B_ID"="C"."NODO_ID" AND "A"."NODO_ID"="B"."NODO_A_ID")&lt;br /&gt;&lt;br /&gt;Note: cpu costing is off&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;********************************************************************************&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SOLUCIÓN al caso.&lt;/span&gt;&lt;br /&gt;********************************************************************************&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Otro producto cartesiano. En este caso el cartesiano sabe muy bien lo que hace. Cruza casi 6.000 millones de filas (en total 61 gigas de información) y un coste mínimo. Vaya paradoja.&lt;br /&gt;&lt;br /&gt;Un detalle para entender esta decisión: no existen restricciones de Primary Key, ni&lt;br /&gt;Foreign Key, ni índices únicos, ni restricciones de Not Null.&lt;br /&gt;&lt;br /&gt;A causa de ello, Oracle encuentra práctico combinar todos los resultados de una tabla (4,5 millones) sobre las 1400 filas de la otra tabla, en un &lt;b&gt;"todos con todos"&lt;/b&gt;.&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;No está mal. No obstante, hay información que Oracle, por mucho que analice las tablas, no va a poder obtener &lt;i&gt;a priori&lt;/i&gt;. Únicamente nos interesan valores únicos de la tabla de relación, que existan en sus respectivas tablas relacionadas, pero, como digo, no existe nada que aporte a Oracle esa información.&lt;br /&gt;&lt;br /&gt;Cambio algunos detalles de la consulta y la dejo así:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt; &lt;span style="font-family: georgia;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;SELECT DISTINCT A.NODO_ID, B.NODO_B_ID NODO_EQ1&lt;br /&gt;FROM     BITOWN03.BS_R_NODOS_BIT_03 A,&lt;br /&gt;      (select distinct nodo_a_id, nodo_b_id from BITOWN03.RE_R_CONEX_EXTERNAS_BIT_03) B,&lt;br /&gt;         BITOWN03.TMP_NODOS_OK_EST_BIT_03 C&lt;br /&gt;WHERE A.NODO_ID = B.NODO_A_ID&lt;br /&gt;  AND B.NODO_B_ID = C.NODO_ID;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Informo de dos cosas: que tengo interés en obtener los códigos distintos de la tabla de relación, y que además existan en las otras dos tablas.&lt;br /&gt;&lt;br /&gt;El plan de ejecución cambia totalmente para ejecutarse tal como lo he dicho &lt;i&gt;de otra forma&lt;/i&gt;. Ahora Oracle realiza este otro plan de ejecución.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 78%;"&gt;&lt;br /&gt;SQL&gt; @c:\oracle\ora92\rdbms\admin\utlxpls&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation             |  Name                       | Rows  | Bytes |TempSpc| Cost  |&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT      |                             |  5554 |   200K|       | 13626 |&lt;br /&gt;|   1 |  NESTED LOOPS         |                             |  5554 |   200K|       | 13626 |&lt;br /&gt;|   2 |   NESTED LOOPS        |                             |  5554 |   168K|       | 13626 |&lt;br /&gt;|   3 |    VIEW               |                             |  7159K|   177M|       | 13626 |&lt;br /&gt;|   4 |     SORT UNIQUE       |                             |  7159K|    81M|   273M| 13626 |&lt;br /&gt;|   5 |      TABLE ACCESS FULL| RE_R_CONEX_EXTERNAS_BIT_03  |  7159K|    81M|       |  2589 |&lt;br /&gt;|*  6 |    INDEX UNIQUE SCAN  | PK_TMP_MANEL_03             |     1 |     5 |       |       |&lt;br /&gt;|*  7 |   INDEX UNIQUE SCAN   | PK_R_NODOS_BIT_03           |     1 |     6 |       |       |&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   6 - access("B"."NODO_B_ID"="C"."NODO_ID")&lt;br /&gt;   7 - access("A"."NODO_ID"="B"."NODO_A_ID")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El coste ahora parece haberse disparado por completo. &lt;b&gt;13626&lt;/b&gt; unidades de coste. Respecto al coste anterior, de sólo 23. Pero ahora no aparece el cartesiano y parece que la ejecución es más fiel a lo que queremos.&lt;br /&gt;&lt;br /&gt;Acabo de lanzar la ejecución: &lt;b&gt;un minuto con veinte segundos.&lt;/b&gt;&lt;br /&gt;Bien.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-2826729742053733670?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/2826729742053733670/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=2826729742053733670' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/2826729742053733670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/2826729742053733670'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/08/optimizacion-de-consultas-sql-en-oracle_31.html' title='Optimizacion de Consultas SQL en Oracle'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-5153035532871681614</id><published>2009-08-31T11:25:00.001-04:00</published><updated>2009-08-31T11:26:48.835-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle Tips'/><title type='text'>Oracle Tips : Cambiar parametro  character set en la base de datos</title><content type='html'>&lt;span style="font-family: verdana;"&gt;1. Check NLS_CHARACTERSET &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Connect to user SYS or SYSTEM&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;SELECT * &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;FROM V$NLS_PARAMETERS &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;WHERE PARAMETER = 'NLS_CHARACTERSET';&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Parameter Value&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;NLS_CHARACTERSET AL32UTF8 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;If you want to change NLS_CHARACTERSET from AL32UTF8 to TH8TISASCII&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;2. Connect to user SYS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;3. Update value &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;UPDATE PROPS$&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;SET VALUE$ = 'TH8TISASCII'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;WHERE NAME = 'NLS_CHARACTERSET';&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;COMMIT; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;4. Restart database&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;SHUTDOWN IMMEDIATE;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;STARTUP;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;5. Check NLS_CHARACTERSET &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Connect to user SYS or SYSTEM&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;SELECT * FROM &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;V$NLS_PARAMETERS &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;WHERE PARAMETER = 'NLS_CHARACTERSET';&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Parameter Value&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;NLS_CHARACTERSET TH8TISASCII&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-5153035532871681614?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/5153035532871681614/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=5153035532871681614' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/5153035532871681614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/5153035532871681614'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/08/oracle-tips-cambiar-parametro-character.html' title='Oracle Tips : Cambiar parametro  character set en la base de datos'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-5227229178679206102</id><published>2009-08-31T11:20:00.000-04:00</published><updated>2009-08-31T11:22:42.322-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='optimizacion Consultas SQL'/><title type='text'>Optimizacion de Consultas SQL en Oracle</title><content type='html'>&lt;span style="font-family: georgia;"&gt;La siguiente consulta se ha cancelado tras &lt;span style="font-weight: bold;"&gt; 15 horas y 37 minutos &lt;/span&gt;de ejecución.&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;SQL&gt; select count(*) from (SELECT BITOWN03.BS_C_CLIENTES_BIT_03.DNICIF_DE,&lt;br /&gt;  2    BITOWN03.HS_C_ESTADOS_CONTRATO_BIT_03.CONTRATO_ID,&lt;br /&gt;  3    HSCONTRATOS_ESTADOS.ESTADO_DE,&lt;br /&gt;  4    BITOWN03.HS_C_ESTADOS_CONTRATO_BIT_03.FEC_ESTADO_DT,&lt;br /&gt;  5    BITOWN03.BS_C_CLIENTES_BIT_03.ABONADO_ID&lt;br /&gt;  6  FROM&lt;br /&gt;  7    BITOWN03.HS_C_ESTADOS_CONTRATO_BIT_03,&lt;br /&gt;  8    BITOWN03.LK_C_ESTADOS_BIT_03  HSCONTRATOS_ESTADOS,&lt;br /&gt;  9    BITOWN03.BS_C_CLIENTES_BIT_03,&lt;br /&gt;10    BITOWN03.BS_C_CONTRATOS_BIT_03  CONTRATOS&lt;br /&gt;11  WHERE  BITOWN03.BS_C_CLIENTES_BIT_03.ABONADO_ID          = CONTRATOS.ABONADO_ID&lt;br /&gt;12    AND  BITOWN03.HS_C_ESTADOS_CONTRATO_BIT_03.CONTRATO_ID = CONTRATOS.CONTRATO_ID&lt;br /&gt;13    AND  BITOWN03.HS_C_ESTADOS_CONTRATO_BIT_03.ESTADO_ID   = HSCONTRATOS_ESTADOS.ESTADO_ID&lt;br /&gt;14    AND  BITOWN03.HS_C_ESTADOS_CONTRATO_BIT_03.FEC_ESTADO_DT&lt;br /&gt;15                   BETWEEN  to_date('01-06-2005 00:00:00','DD-MM-YYYY HH24:MI:SS')&lt;br /&gt;16                       AND  to_date('30-06-2005 23:59:59','DD-MM-YYYY HH24:MI:SS')&lt;br /&gt;17   AND  BITOWN03.HS_C_ESTADOS_CONTRATO_BIT_03.ESTADO_ID  =  'BA');&lt;br /&gt;  BITOWN03.HS_C_ESTADOS_CONTRATO_BIT_03,&lt;br /&gt;           *&lt;br /&gt;ERROR at line 7:&lt;br /&gt;ORA-00028: your session has been killed&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Elapsed: 15:37:01.66&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;con el siguiente plan de ejecución:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 50%;"&gt;  SQL&gt; @C:\ORACLE\ORA92\RDBMS\ADMIN\UTLXPLS&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                           |  Name                         | Rows  | Bytes | Cost  | Pstart| Pstop |&lt;br /&gt;---------------------------------------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT                    |                               |   461 | 24433 |    16 |       |       |&lt;br /&gt;|   1 |  NESTED LOOPS                       |                               |   461 | 24433 |    16 |       |       |&lt;br /&gt;|   2 |   MERGE JOIN CARTESIAN              |                               |  1448M|    58G|    16 |       |       |&lt;br /&gt;|   3 |    NESTED LOOPS                     |                               |   971 | 35927 |    16 |       |       |&lt;br /&gt;|   4 |     TABLE ACCESS BY INDEX ROWID     | LK_C_ESTADOS_BIT_03           |     1 |    20 |     1 |       |       |&lt;br /&gt;|*  5 |      INDEX UNIQUE SCAN              | PK_C_ESTADOS_BIT_03           |     1 |       |       |       |       |&lt;br /&gt;|*  6 |     INDEX RANGE SCAN                | IDX_FECHA_ESTADO_CONT_JAVIER  |   971 | 16507 |    15 |       |       |&lt;br /&gt;|   7 |    BUFFER SORT                      |                               |  1491K|  8739K|     1 |       |       |&lt;br /&gt;|   8 |     INDEX FULL SCAN                 | PK_C_CLIENTES_BIT_03          |  1491K|  8739K|       |       |       |&lt;br /&gt;|*  9 |   TABLE ACCESS BY GLOBAL INDEX ROWID| BS_C_CONTRATOS_BIT_03         |     1 |    10 |       | ROWID | ROW L |&lt;br /&gt;|* 10 |    INDEX UNIQUE SCAN                | PK_C_CONTRATOS_BIT_03         |     1 |       |       |       |       |&lt;br /&gt;---------------------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   5 - access("HSCONTRATOS_ESTADOS"."ESTADO_ID"='BA')&lt;br /&gt;   6 - access("HS_C_ESTADOS_CONTRATO_BIT_03"."FEC_ESTADO_DT"&gt;=TO_DATE('2005-06-01 00:00:00', 'yyyy-mm-dd&lt;br /&gt;              hh24:mi:ss') AND "HS_C_ESTADOS_CONTRATO_BIT_03"."ESTADO_ID"='BA' AND&lt;br /&gt;              "HS_C_ESTADOS_CONTRATO_BIT_03"."FEC_ESTADO_DT"&lt;=TO_DATE('2005-06-30 23:59:59', 'yyyy-mm-dd hh24:mi:ss'))&lt;br /&gt;       filter("HS_C_ESTADOS_CONTRATO_BIT_03"."ESTADO_ID"="HSCONTRATOS_ESTADOS"."ESTADO_ID" AND&lt;br /&gt;              "HS_C_ESTADOS_CONTRATO_BIT_03"."ESTADO_ID"='BA')&lt;br /&gt;   9 - filter("BS_C_CLIENTES_BIT_03"."ABONADO_ID"="CONTRATOS"."ABONADO_ID")&lt;br /&gt;  10 - access("HS_C_ESTADOS_CONTRATO_BIT_03"."CONTRATO_ID"="CONTRATOS"."CONTRATO_ID")&lt;br /&gt;&lt;br /&gt;Note: cpu costing is off&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;********************************************************************************&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SOLUCIÓN al caso.&lt;/span&gt;&lt;br /&gt;********************************************************************************&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;Las tablas contienen estadísticas fieles. El producto cartesiano tampoco engaña: cruzará 58 Gb. para atender nuestra petición. De todas maneras, algo falla. Ese plan no es óptimo.&lt;br /&gt;&lt;br /&gt;Las estadísticas se generan mediante la siguiente llamada a &lt;b&gt;DBMS_STATS&lt;/b&gt;.&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 75%;"&gt;&lt;br /&gt;SQL&gt; begin&lt;br /&gt;  2      DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=&gt;usuario,&lt;br /&gt;  3         TABNAME=&gt;tabla,&lt;br /&gt;  4         ESTIMATE_PERCENT=&gt;dbms_stats.auto_sample_size,&lt;br /&gt;  5         METHOD_OPT =&gt; 'FOR ALL INDEXED COLUMNS SIZE 1',&lt;br /&gt;  6         DEGREE=&gt;4);&lt;br /&gt;  7  end;&lt;br /&gt;  8  /&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es preciso no únicamente analizar las tablas, sino también los índices. Algunos de ellos están analizados con el procedimiento &lt;b&gt;DBMS_STATS.GATHER_INDEX_STATS&lt;/b&gt;, pero una de las tablas está particionada. Lo mejor y más simple es incluir el parámetro &lt;b&gt;CASCADE=&gt;TRUE&lt;/b&gt; en la llamada a &lt;b&gt;DBMS_STATS&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Es cierto que el coste de análisis de estas tablas incrementará. Además, el parámetro CASCADE afecta, no sólo a índices, sino también a vistas materializadas, particiones, etc. (es decir, a todas sus dependencias).&lt;br /&gt;&lt;br /&gt;Con las tablas analizadas de este modo, el nuevo plan de ejecución es éste:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; &lt;span style="font-family: georgia;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;&lt;span style="font-size: 60%;"&gt;&lt;span style="font-family: courier new;"&gt;SQL&gt; @c:\oracle\ora92\rdbms\admin\utlxpls&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;----------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                      |  Name                         | Rows  | Bytes | Cost  |&lt;br /&gt;------------------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT               |                               |   471 | 30615 |   405 |&lt;br /&gt;|*  1 |  HASH JOIN                     |                               |   471 | 30615 |   405 |&lt;br /&gt;|*  2 |   INDEX RANGE SCAN             | IDX_FECHA_ESTADO_CONT_JAVIER  |  8740 |   145K|    75 |&lt;br /&gt;|   3 |   NESTED LOOPS                 |                               |   771K|    35M|   257 |&lt;br /&gt;|   4 |    NESTED LOOPS                |                               |  1626K|    46M|   257 |&lt;br /&gt;|   5 |     TABLE ACCESS BY INDEX ROWID| LK_C_ESTADOS_BIT_03           |     1 |    20 |     1 |&lt;br /&gt;|*  6 |      INDEX UNIQUE SCAN         | PK_C_ESTADOS_BIT_03           |     1 |       |       |&lt;br /&gt;|   7 |     INDEX FAST FULL SCAN       | IDX_ABONADO_CONTRATO          |  1626K|    15M|   256 |&lt;br /&gt;|   8 |    TABLE ACCESS BY INDEX ROWID | BS_C_CLIENTES_BIT_03          |     1 |    18 |       |&lt;br /&gt;|*  9 |     INDEX UNIQUE SCAN          | PK_C_CLIENTES_BIT_03          |     1 |       |       |&lt;br /&gt;------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   1 - access("HS_C_ESTADOS_CONTRATO_BIT_03"."CONTRATO_ID"="CONTRATOS"."CONTRATO_ID" AND&lt;br /&gt;              "HS_C_ESTADOS_CONTRATO_BIT_03"."ESTADO_ID"="HSCONTRATOS_ESTADOS"."ESTADO_ID")&lt;br /&gt;   2 - access("HS_C_ESTADOS_CONTRATO_BIT_03"."FEC_ESTADO_DT"&gt;=TO_DATE('2005-06-01 00:00:00',&lt;br /&gt;              'yyyy-mm-dd hh24:mi:ss') AND "HS_C_ESTADOS_CONTRATO_BIT_03"."ESTADO_ID"='BA' AND&lt;br /&gt;              "HS_C_ESTADOS_CONTRATO_BIT_03"."FEC_ESTADO_DT"&lt;=TO_DATE('2005-06-30 23:59:59', 'yyyy-mm-dd&lt;br /&gt;              hh24:mi:ss'))&lt;br /&gt;       filter("HS_C_ESTADOS_CONTRATO_BIT_03"."ESTADO_ID"='BA')&lt;br /&gt;   6 - access("HSCONTRATOS_ESTADOS"."ESTADO_ID"='BA')&lt;br /&gt;   9 - access("BS_C_CLIENTES_BIT_03"."ABONADO_ID"="CONTRATOS"."ABONADO_ID")&lt;br /&gt;&lt;br /&gt;Note: cpu costing is off&lt;br /&gt;&lt;br /&gt;30 rows selected.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La ejecución ahora sólo tarda: &lt;b&gt; 3 segundos.&lt;/b&gt;&lt;br /&gt;El coste de análisis aumenta de 26 minutos a 32 minutos. La ganancia justifica el coste.&lt;br /&gt;&lt;br /&gt;Muy bien. &lt;b&gt;:-)&lt;/b&gt;&lt;br /&gt;     &lt;div class="byline"&gt;&lt;a href="http://optimizacionoracle.blogspot.com/2005/10/otro-producto-cartesiano.html" title="permanent link"&gt;#&lt;/a&gt; posted by Javier Morales @ 6:13 PM &lt;a href="https://www.blogger.com/comment.g?blogID=18804180&amp;amp;postID=113155645143274816" href="https://www.blogger.com/comment.g?blogID=18804180&amp;amp;postID=113155645143274816;"&gt;0 comments&lt;/a&gt;  &lt;span class="item-control blog-admin pid-636483228"&gt;&lt;a style="border: medium none ;" href="post-edit.g?blogID=18804180&amp;amp;postID=113155645143274816" title="Editar entrada"&gt;&lt;img class="icon-action" alt="" src="img/icon18_edit_allbkg.gif" height="18" width="18" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/div&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;             &lt;h3&gt;lunes, octubre 17, 2005&lt;/h3&gt;        &lt;a name="113155640287444366"&gt; &lt;/a&gt;    &lt;h2&gt; NOT IN vs. NOT EXISTS.&lt;/h2&gt;    &lt;div class="blogPost"&gt;      &lt;i&gt;&lt;b&gt;Para Fernando&lt;/b&gt;, por la que le espera.&lt;/i&gt; :-P&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;La siguiente consulta se ha cancelado tras &lt;span style="font-weight: bold;"&gt; 5 horas y 11 minutos &lt;/span&gt;en ejecutarse.&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;SELECT count(CLI.COD_ABONADO)&lt;br /&gt;   FROM BITOWN02.TM_C_CLIENTES_SAC_02 CLI,&lt;br /&gt;        BITOWN02.TE_ERRORES_BIT_02 TE&lt;br /&gt;   WHERE CLI.ROWID = TE.FILA_ID (+)&lt;br /&gt;     AND 'TM_C_CLIENTES_SAC_02' = TE.TABLA_DE (+)&lt;br /&gt;     AND TE.ERROR_ID IS NULL&lt;br /&gt;   AND CLI.COD_ABONADO NOT IN (&lt;br /&gt;   SELECT CU.ABONADO_id&lt;br /&gt;     FROM BITOWN03.BS_C_CONTRATOS_BIT_03 CONT, BITOWN03.BS_C_CUENTAS_BIT_03 CU&lt;br /&gt;    WHERE CU.CUENTA_ID=CONT.CUENTA_ID&lt;br /&gt;  );&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;con el siguiente plan de ejecución:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 50%;"&gt;SQL&gt; @c:\oracle\ora92\rdbms\admin\utlxpls&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                      |  Name                  | Rows  | Bytes | Cost  | Pstart| Pstop |&lt;br /&gt;---------------------------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT               |                        |     1 |    44 |  3343 |       |       |&lt;br /&gt;|   1 |  SORT AGGREGATE                |                        |     1 |    44 |       |       |       |&lt;br /&gt;|*  2 |   FILTER                       |                        |       |       |       |       |       |&lt;br /&gt;|*  3 |    FILTER                      |                        |       |       |       |       |       |&lt;br /&gt;|*  4 |     HASH JOIN OUTER            |                        |       |       |       |       |       |&lt;br /&gt;|   5 |      TABLE ACCESS FULL         | TM_C_CLIENTES_SAC_02   | 74323 |   870K|  2407 |       |       |&lt;br /&gt;|   6 |      TABLE ACCESS FULL         | TE_M_ERRORES_BIT_01    |     1 |    32 |     2 |    13 |    13 |&lt;br /&gt;|   7 |    NESTED LOOPS                |                        |  1640K|    50M|   922 |       |       |&lt;br /&gt;|   8 |     PARTITION LIST ALL         |                        |       |       |       |     1 |     7 |&lt;br /&gt;|   9 |      TABLE ACCESS FULL         | BS_C_CONTRATOS_BIT_03  |  1640K|    20M|   922 |     1 |     7 |&lt;br /&gt;|* 10 |     TABLE ACCESS BY INDEX ROWID| BS_C_CUENTAS_BIT_03    |     1 |    19 |       |       |       |&lt;br /&gt;|* 11 |      INDEX UNIQUE SCAN         | PK_C_CUENTAS_BIT_03    |     1 |       |       |       |       |&lt;br /&gt;---------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   2 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "BITOWN03"."BS_C_CUENTAS_BIT_03"&lt;br /&gt;              "CU","BITOWN03"."BS_C_CONTRATOS_BIT_03" "CONT" WHERE "CU"."CUENTA_ID"="CONT"."CUENTA_ID" AND&lt;br /&gt;              LNNVL("CU"."ABONADO_ID"&lt;&gt;:B1)))&lt;br /&gt;   3 - filter("TE_M_ERRORES_BIT_01"."ERROR_ID" IS NULL)&lt;br /&gt;   4 - access("SYS_ALIAS_1".ROWID="TE_M_ERRORES_BIT_01"."FILA_ID"(+))&lt;br /&gt;  10 - filter(LNNVL("CU"."ABONADO_ID"&lt;&gt;:B1))&lt;br /&gt;  11 - access("CU"."CUENTA_ID"="CONT"."CUENTA_ID")&lt;br /&gt;&lt;br /&gt;Note: cpu costing is off&lt;br /&gt;&lt;br /&gt;30 rows selected.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;********************************************************************************&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SOLUCIÓN al caso.&lt;/span&gt;&lt;br /&gt;********************************************************************************&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;En este caso, la consulta con IN tiene un coste aceptable. No obstante, después de cinco horas de ejecución, es de sospechar que la cosa no va muy bien. La estrategia de ejecución es realizar dos FILTER: el primero para el OuterJoin de Clientes sin errores y el segundo para combinarlo (en un pesadísimo NestedLoops) con las cuentas con contratos.&lt;br /&gt;&lt;br /&gt;Como la subconsulta está resultando más pesada incluso que la principal, es posible que sustituir &lt;b&gt;IN&lt;/b&gt; por la cláusula &lt;b&gt;EXISTS&lt;/b&gt; sea &lt;a href="http://oraclexperto.blogspot.com/2005/09/in-vs-exists.html"&gt;una buena estrategia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Sí, también tengo cuidado que no haya códigos con valor NULL para resolver la consulta, ya que &lt;b&gt;NOT IN&lt;/b&gt; y &lt;b&gt;NOT EXISTS&lt;/b&gt; &lt;a href="http://oraclexperto.blogspot.com/2005/07/not-in-y-not-exists-no-son-lo-mismo.html"&gt;no son lo mismo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Sustituyo NOT IN por NOT EXISTS y la consulta queda de este modo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; &lt;span style="font-family: georgia;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;explain plan for&lt;br /&gt;SELECT count(CLI.COD_ABONADO)&lt;br /&gt;   FROM BITOWN02.TM_C_CLIENTES_SAC_02 CLI,&lt;br /&gt;        BITOWN02.TE_ERRORES_BIT_02 TE&lt;br /&gt;   WHERE CLI.ROWID = TE.FILA_ID (+)&lt;br /&gt;     AND 'TM_C_CLIENTES_SAC_02' = TE.TABLA_DE (+)&lt;br /&gt;     AND TE.ERROR_ID IS NULL&lt;br /&gt;   AND not exists (&lt;br /&gt;   SELECT null&lt;br /&gt;   FROM BITOWN03.BS_C_CONTRATOS_BIT_03 CONT, BITOWN03.BS_C_CUENTAS_BIT_03 CU&lt;br /&gt;  WHERE CLI.COD_ABONADO=CU.ABONADO_ID AND&lt;br /&gt;        CU.CUENTA_ID=CONT.CUENTA_ID);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El plan de ejecución resultante parece ser similar al anterior, incluso su coste parece peor.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 50%;"&gt;&lt;br /&gt;SQL&gt; @c:\oracle\ora92\rdbms\admin\utlxpls&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                         |  Name                  | Rows  | Bytes |TempSpc| Cost  | Pstart| Pstop |&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT                  |                        |     1 |    57 |       |  4946 |    |          |&lt;br /&gt;|   1 |  SORT AGGREGATE                   |                        |     1 |    57 |       |       |    |          |&lt;br /&gt;|*  2 |   FILTER                          |                        |       |       |       |       |    |          |&lt;br /&gt;|*  3 |    HASH JOIN OUTER                |                        |       |       |       |       |    |          |&lt;br /&gt;|*  4 |     HASH JOIN ANTI                |                        |  1486K|    35M|    34M|  4269 |    |          |&lt;br /&gt;|   5 |      TABLE ACCESS FULL            | TM_C_CLIENTES_SAC_02   |  1486K|    17M|       |  2407 |    |          |&lt;br /&gt;|   6 |      VIEW                         | VW_SQ_1                |  1640K|    20M|       |   922 |    |          |&lt;br /&gt;|   7 |       NESTED LOOPS                |                        |  1640K|    50M|       |   922 |    |          |&lt;br /&gt;|   8 |        PARTITION LIST ALL         |                        |       |       |       |       |  1 |        7 |&lt;br /&gt;|   9 |         TABLE ACCESS FULL         | BS_C_CONTRATOS_BIT_03  |  1640K|    20M|       |   922 |  1 |        7 |&lt;br /&gt;|  10 |        TABLE ACCESS BY INDEX ROWID| BS_C_CUENTAS_BIT_03    |     1 |    19 |       |       |    |          |&lt;br /&gt;|* 11 |         INDEX UNIQUE SCAN         | PK_C_CUENTAS_BIT_03    |     1 |       |       |       |    |          |&lt;br /&gt;|  12 |     TABLE ACCESS FULL             | TE_M_ERRORES_BIT_01    |     1 |    32 |       |     2 | 13 |       13 |&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   2 - filter("TE_M_ERRORES_BIT_01"."ERROR_ID" IS NULL)&lt;br /&gt;   3 - access("CLI".ROWID="TE_M_ERRORES_BIT_01"."FILA_ID"(+))&lt;br /&gt;   4 - access("CLI"."COD_ABONADO"="VW_SQ_1"."ABONADO_ID")&lt;br /&gt;  11 - access("CU"."CUENTA_ID"="CONT"."CUENTA_ID")&lt;br /&gt;&lt;br /&gt;Note: cpu costing is off&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Acabo de lanzar la ejecución: &lt;b&gt; 28 segundos.&lt;/b&gt;&lt;br /&gt;Très bien. &lt;b&gt;:-)&lt;/b&gt;&lt;br /&gt;     &lt;div class="byline"&gt;&lt;a href="http://optimizacionoracle.blogspot.com/2005/10/not-in-vs-not-exists.html" title="permanent link"&gt;#&lt;/a&gt; posted by Javier Morales @ 6:12 PM &lt;a href="https://www.blogger.com/comment.g?blogID=18804180&amp;amp;postID=113155640287444366" href="https://www.blogger.com/comment.g?blogID=18804180&amp;amp;postID=113155640287444366;"&gt;0 comments&lt;/a&gt;  &lt;span class="item-control blog-admin pid-636483228"&gt;&lt;a style="border: medium none ;" href="post-edit.g?blogID=18804180&amp;amp;postID=113155640287444366" title="Editar entrada"&gt;&lt;img class="icon-action" alt="" src="img/icon18_edit_allbkg.gif" height="18" width="18" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/div&gt;    &lt;/span&gt;&lt;/div&gt;             &lt;h3&gt;jueves, octubre 13, 2005&lt;/h3&gt;        &lt;a name="113155635525997253"&gt; &lt;/a&gt;    &lt;h2&gt; Dílo de otra forma.&lt;/h2&gt;    &lt;div class="blogPost"&gt;      &lt;i&gt;&lt;b&gt;Para Manel Moreno&lt;/b&gt;, que no me ha dado ningún beso por ésto.&lt;/i&gt; :P&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;&lt;span style="font-weight: bold;"&gt;La siguiente consulta tardaba 11 horas en ejecutarse.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;SELECT DISTINCT A.NODO_ID, B.NODO_B_ID NODO_EQ1&lt;br /&gt;FROM BITOWN03.BS_R_NODOS_BIT_03 A,&lt;br /&gt;         BITOWN03.RE_R_CONEX_EXTERNAS_BIT_03 B,&lt;br /&gt;         BITOWN03.TMP_NODOS_OK_EST_BIT_03 C&lt;br /&gt;WHERE A.NODO_ID = B.NODO_A_ID&lt;br /&gt;  AND B.NODO_B_ID = C.NODO_ID;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;con el siguiente plan de ejecución:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 78%;"&gt;SQL&gt; @c:\oracle\ora92\rdbms\admin\utlxpls&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;-----------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation              |  Name                    | Rows  | Bytes | Cost  |&lt;br /&gt;-----------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT       |                          |  5554 |   124K|    23 |&lt;br /&gt;|   1 |  SORT UNIQUE           |                          |  5554 |   124K|    23 |&lt;br /&gt;|   2 |   NESTED LOOPS         |                          |  5554 |   124K|     2 |&lt;br /&gt;|   3 |    MERGE JOIN CARTESIAN|                          |  5985M|    61G|     2 |&lt;br /&gt;|   4 |     TABLE ACCESS FULL  | TMP_NODOS_OK_EST_BIT_03  |  1327 |  6635 |     2 |&lt;br /&gt;|   5 |     BUFFER SORT        |                          |  4510K|    25M|       |&lt;br /&gt;|   6 |      INDEX FULL SCAN   | PK_R_NODOS_BIT_03        |  4510K|    25M|       |&lt;br /&gt;|*  7 |    INDEX RANGE SCAN    | IDX_NODO_CONEX_EXTERNA   |     1 |    12 |       |&lt;br /&gt;-----------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   7 - access("B"."NODO_B_ID"="C"."NODO_ID" AND "A"."NODO_ID"="B"."NODO_A_ID")&lt;br /&gt;&lt;br /&gt;Note: cpu costing is off&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;********************************************************************************&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SOLUCIÓN al caso.&lt;/span&gt;&lt;br /&gt;********************************************************************************&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Otro producto cartesiano. En este caso el cartesiano sabe muy bien lo que hace. Cruza casi 6.000 millones de filas (en total 61 gigas de información) y un coste mínimo. Vaya paradoja.&lt;br /&gt;&lt;br /&gt;Un detalle para entender esta decisión: no existen restricciones de Primary Key, ni&lt;br /&gt;Foreign Key, ni índices únicos, ni restricciones de Not Null.&lt;br /&gt;&lt;br /&gt;A causa de ello, Oracle encuentra práctico combinar todos los resultados de una tabla (4,5 millones) sobre las 1400 filas de la otra tabla, en un &lt;b&gt;"todos con todos"&lt;/b&gt;.&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;No está mal. No obstante, hay información que Oracle, por mucho que analice las tablas, no va a poder obtener &lt;i&gt;a priori&lt;/i&gt;. Únicamente nos interesan valores únicos de la tabla de relación, que existan en sus respectivas tablas relacionadas, pero, como digo, no existe nada que aporte a Oracle esa información.&lt;br /&gt;&lt;br /&gt;Cambio algunos detalles de la consulta y la dejo así:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt; &lt;span style="font-family: georgia;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;SELECT DISTINCT A.NODO_ID, B.NODO_B_ID NODO_EQ1&lt;br /&gt;FROM     BITOWN03.BS_R_NODOS_BIT_03 A,&lt;br /&gt;      (select distinct nodo_a_id, nodo_b_id from BITOWN03.RE_R_CONEX_EXTERNAS_BIT_03) B,&lt;br /&gt;         BITOWN03.TMP_NODOS_OK_EST_BIT_03 C&lt;br /&gt;WHERE A.NODO_ID = B.NODO_A_ID&lt;br /&gt;  AND B.NODO_B_ID = C.NODO_ID;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Informo de dos cosas: que tengo interés en obtener los códigos distintos de la tabla de relación, y que además existan en las otras dos tablas.&lt;br /&gt;&lt;br /&gt;El plan de ejecución cambia totalmente para ejecutarse tal como lo he dicho &lt;i&gt;de otra forma&lt;/i&gt;. Ahora Oracle realiza este otro plan de ejecución.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 78%;"&gt;&lt;br /&gt;SQL&gt; @c:\oracle\ora92\rdbms\admin\utlxpls&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation             |  Name                       | Rows  | Bytes |TempSpc| Cost  |&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT      |                             |  5554 |   200K|       | 13626 |&lt;br /&gt;|   1 |  NESTED LOOPS         |                             |  5554 |   200K|       | 13626 |&lt;br /&gt;|   2 |   NESTED LOOPS        |                             |  5554 |   168K|       | 13626 |&lt;br /&gt;|   3 |    VIEW               |                             |  7159K|   177M|       | 13626 |&lt;br /&gt;|   4 |     SORT UNIQUE       |                             |  7159K|    81M|   273M| 13626 |&lt;br /&gt;|   5 |      TABLE ACCESS FULL| RE_R_CONEX_EXTERNAS_BIT_03  |  7159K|    81M|       |  2589 |&lt;br /&gt;|*  6 |    INDEX UNIQUE SCAN  | PK_TMP_MANEL_03             |     1 |     5 |       |       |&lt;br /&gt;|*  7 |   INDEX UNIQUE SCAN   | PK_R_NODOS_BIT_03           |     1 |     6 |       |       |&lt;br /&gt;---------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   6 - access("B"."NODO_B_ID"="C"."NODO_ID")&lt;br /&gt;   7 - access("A"."NODO_ID"="B"."NODO_A_ID")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El coste ahora parece haberse disparado por completo. &lt;b&gt;13626&lt;/b&gt; unidades de coste. Respecto al coste anterior, de sólo 23. Pero ahora no aparece el cartesiano y parece que la ejecución es más fiel a lo que queremos.&lt;br /&gt;&lt;br /&gt;Acabo de lanzar la ejecución: &lt;b&gt;un minuto con veinte segundos.&lt;/b&gt;&lt;br /&gt;Bien.&lt;br /&gt;     &lt;div class="byline"&gt;&lt;a href="http://optimizacionoracle.blogspot.com/2005/10/dlo-de-otra-forma.html" title="permanent link"&gt;#&lt;/a&gt; posted by Javier Morales @ 6:11 PM &lt;a href="https://www.blogger.com/comment.g?blogID=18804180&amp;amp;postID=113155635525997253" href="https://www.blogger.com/comment.g?blogID=18804180&amp;amp;postID=113155635525997253;"&gt;0 comments&lt;/a&gt;  &lt;span class="item-control blog-admin pid-636483228"&gt;&lt;a style="border: medium none ;" href="post-edit.g?blogID=18804180&amp;amp;postID=113155635525997253" title="Editar entrada"&gt;&lt;img class="icon-action" alt="" src="img/icon18_edit_allbkg.gif" height="18" width="18" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;/div&gt;    &lt;/span&gt;&lt;/div&gt;             &lt;h3&gt;martes, octubre 11, 2005&lt;/h3&gt;        &lt;a name="113155629270342420"&gt; &lt;/a&gt;    &lt;h2&gt; Mala Cardinalidad&lt;/h2&gt;          &lt;i&gt;&lt;b&gt;Para Cristina Álvarez&lt;/b&gt;, quien confió en mi desde el primer momento y lo disimuló con toda su alma.&lt;/i&gt; :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: georgia;"&gt;&lt;span style="font-weight: bold;"&gt;La siguiente consulta ha sido cancelada tras una hora y veinte minutos de ejecución.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;SELECT N2.ENTIDAD_ID,&lt;br /&gt;       CLI.rowid row_id, cli.*,&lt;br /&gt;       MAX(REL.ABONADO_PADRE_ID) OVER (PARTITION BY ABONADO_HIJO_ID) REL_ABONADO_PADRE_ID&lt;br /&gt;FROM BITOWN03.BS_V_MGEC_NODO_BIT_03 N1,&lt;br /&gt;     BITOWN03.BS_V_MGEC_NODO_BIT_03 N2,&lt;br /&gt;     BITOWN03.BS_V_MGEC_REL_NODOS_BIT_03 RN,&lt;br /&gt;     BITOWN02.TM_C_CLIENTES_SAC_02 CLI,&lt;br /&gt;     BITOWN03.RE_C_RELACIONES_ABONADO_BIT_03 REL&lt;br /&gt;WHERE N1.ENTIDAD_ID= CLI.COD_DNICIF&lt;br /&gt;  AND N1.NODO_ID=RN.NODO_ID&lt;br /&gt;  AND RN.TIPO_RELACION_ID=2 AND RN.FECHA_FIN_DT IS NULL&lt;br /&gt;  AND RN.NODO_PADRE_ID=N2.NODO_ID&lt;br /&gt;  AND CLI.COD_ABONADO = REL.ABONADO_HIJO_ID (+);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;con el siguiente plan de ejecución:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 78%;"&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;---------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation                       |  Name                           | Rows  | Bytes | Cost  |&lt;br /&gt;---------------------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT                |                                 |     1 |   278 |  2496 |&lt;br /&gt;|   1 |  SORT UNIQUE                    |                                 |     1 |   278 |  2496 |&lt;br /&gt;|   2 |   WINDOW SORT                   |                                 |     1 |   278 |  2496 |&lt;br /&gt;|   3 |    NESTED LOOPS                 |                                 |     1 |   278 |  2479 |&lt;br /&gt;|   4 |     NESTED LOOPS                |                                 |     1 |   261 |  2478 |&lt;br /&gt;|   5 |      NESTED LOOPS OUTER         |                                 |     1 |   244 |  2477 |&lt;br /&gt;|   6 |       MERGE JOIN CARTESIAN      |                                 |     1 |   232 |  2477 |&lt;br /&gt;|*  7 |        TABLE ACCESS FULL        | BS_V_MGEC_REL_NODOS_BIT_03      |     1 |    22 |    70 |&lt;br /&gt;|   8 |        BUFFER SORT              |                                 |  1486K|   297M|  2407 |&lt;br /&gt;|   9 |         TABLE ACCESS FULL       | TM_C_CLIENTES_SAC_02            |  1486K|   297M|  2407 |&lt;br /&gt;|* 10 |       INDEX FULL SCAN           | PK_C_RELACIONES_ABONADO_BIT_03  |     1 |    12 |       |&lt;br /&gt;|* 11 |      TABLE ACCESS BY INDEX ROWID| BS_V_MGEC_NODO_BIT_03           |     1 |    17 |     1 |&lt;br /&gt;|* 12 |       INDEX UNIQUE SCAN         | PK_V_MGEC_NODO_BIT_03           |     1 |       |       |&lt;br /&gt;|  13 |     TABLE ACCESS BY INDEX ROWID | BS_V_MGEC_NODO_BIT_03           |     1 |    17 |     1 |&lt;br /&gt;|* 14 |      INDEX UNIQUE SCAN          | PK_V_MGEC_NODO_BIT_03           |     1 |       |       |&lt;br /&gt;---------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   7 - filter("RN"."TIPO_RELACION_ID"=2 AND "RN"."FECHA_FIN_DT" IS NULL)&lt;br /&gt;  10 - access("CLI"."COD_ABONADO"="REL"."ABONADO_HIJO_ID"(+))&lt;br /&gt;       filter("CLI"."COD_ABONADO"="REL"."ABONADO_HIJO_ID"(+))&lt;br /&gt;  11 - filter("N1"."ENTIDAD_ID"="CLI"."COD_DNICIF")&lt;br /&gt;  12 - access("N1"."NODO_ID"="RN"."NODO_ID")&lt;br /&gt;  14 - access("RN"."NODO_PADRE_ID"="N2"."NODO_ID")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;********************************************************************************&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SOLUCIÓN al caso.&lt;/span&gt;&lt;br /&gt;********************************************************************************&lt;br /&gt;&lt;br /&gt;Omitiendo el detalle que la cláusula distinct sobra. La mantenemos para que los planes resulten de ejecuciones similares.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; &lt;div style="text-align: justify;"&gt;&lt;span style="font-family: georgia;"&gt;&lt;span style="font-size: 100%;"&gt;Parece un plan bastante aceptable. No obstante, un producto cartesiano llama la atención... ¿únicamente se obtiene una fila? en ese caso, el cartesiano no hace daño. Vamos a consultar el total de filas de la tabla, si la tabla tiene generadas estadísticas (la columna &lt;span style="font-style: italic;"&gt;num_rows&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;user_tables&lt;/span&gt; puede darnos una pista) y si el filtro de la operación 7 realmente resuelve una única fila.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt; &lt;span style="font-family: georgia;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;span style="font-family: courier new;"&gt;SQL&gt; select count(*) from bitown03.BS_V_MGEC_REL_NODOS_BIT_03;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  COUNT(*)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;----------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    &lt;span style="font-weight: bold;"&gt;118907&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;SQL&gt; select table_name, num_rows from dba_tables where&lt;br /&gt;2  table_name='BS_V_MGEC_REL_NODOS_BIT_03';&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;TABLE_NAME                       NUM_ROWS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;------------------------------ ----------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;BS_V_MGEC_REL_NODOS_BIT_03         118907&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;SQL&gt; select count(*) from bitown03.BS_V_MGEC_REL_NODOS_BIT_03&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  2  where TIPO_RELACION_ID=2 AND FECHA_FIN_DT IS NULL;   &lt;span style="font-weight: bold;"&gt;--&gt; FILTRO OPERACION 7 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  COUNT(*)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;----------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;     12844&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pues parece que no... Se está produciendo un producto cartesiano de 1,5 millones de filas (operación 9 TABLE FULL SCAN) sobre 12844 elementos. Oracle está estimando mal la cardinalidad de las filas. Cree que con el filtro 7 únicamente obtendrá una fila y por eso el producto cartesiano no dispara el coste.&lt;br /&gt;&lt;br /&gt;Graso error.&lt;br /&gt;&lt;br /&gt;Es preciso analizar CORRECTAMENTE las tablas implicadas, indicando que se analicen también los valores de las columnas implicadas. Los comandos para realizar ese análisis son:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 78%;"&gt;&lt;span style="font-family: courier new;"&gt;SQL&gt; exec dbms_stats.gather_table_stats(OWNNAME=&gt;'usuario',TABNAME=&gt;'BS_V_MGEC_REL_NODOS_BIT_03',METHOD_OPT=&gt;'for all columns');&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;Elapsed: 00:00:07.71&lt;br /&gt;SQL&gt; exec dbms_stats.gather_table_stats(OWNNAME=&gt;'usuario',TABNAME=&gt;'BS_V_MGEC_NODO_BIT_03',METHOD_OPT=&gt;'for all columns');&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;Elapsed: 00:00:14.57&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: georgia;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;De esta forma, las estadísticas tienen también información sobre la cardinalidad de las columnas y el plan de ejecución cambia sustancialmente:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 78%;"&gt;&lt;br /&gt;&lt;br /&gt;SQL&gt; @c:\oracle\ora92\rdbms\admin\utlxpls&lt;br /&gt;&lt;br /&gt;PLAN_TABLE_OUTPUT&lt;br /&gt;---------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation               |  Name                           | Rows  | Bytes |TempSpc| Cost  |&lt;br /&gt;---------------------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT        |                                 |   209K|    53M|       | 12462 |&lt;br /&gt;|   1 |  SORT UNIQUE            |                                 |   209K|    53M|   112M| 12462 |&lt;br /&gt;|   2 |   WINDOW SORT           |                                 |   209K|    53M|   112M| 12462 |&lt;br /&gt;|   3 |    NESTED LOOPS OUTER   |                                 |   209K|    53M|       |  4217 |&lt;br /&gt;|*  4 |     HASH JOIN           |                                 |   209K|    51M|       |  4217 |&lt;br /&gt;|*  5 |      HASH JOIN          |                                 | 12841 |   589K|       |   320 |&lt;br /&gt;|*  6 |       HASH JOIN         |                                 | 12841 |   388K|       |   192 |&lt;br /&gt;|*  7 |        TABLE ACCESS FULL| BS_V_MGEC_REL_NODOS_BIT_03      | 12841 |   188K|       |    70 |&lt;br /&gt;|   8 |        TABLE ACCESS FULL| BS_V_MGEC_NODO_BIT_03           |   128K|  2012K|       |   112 |&lt;br /&gt;|   9 |       TABLE ACCESS FULL | BS_V_MGEC_NODO_BIT_03           |   128K|  2012K|       |   112 |&lt;br /&gt;|  10 |      TABLE ACCESS FULL  | TM_C_CLIENTES_SAC_02            |  1486K|   297M|       |  2407 |&lt;br /&gt;|* 11 |     INDEX FULL SCAN     | PK_C_RELACIONES_ABONADO_BIT_03  |     1 |    12 |       |       |&lt;br /&gt;---------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   4 - access("N1"."ENTIDAD_ID"="CLI"."COD_DNICIF")&lt;br /&gt;   5 - access("RN"."NODO_PADRE_ID"="N2"."NODO_ID")&lt;br /&gt;   6 - access("N1"."NODO_ID"="RN"."NODO_ID")&lt;br /&gt;   7 - filter("RN"."TIPO_RELACION_ID"=2 AND "RN"."FECHA_FIN_DT" IS NULL)&lt;br /&gt;  11 - access("CLI"."COD_ABONADO"="REL"."ABONADO_HIJO_ID"(+))&lt;br /&gt;       filter("CLI"."COD_ABONADO"="REL"."ABONADO_HIJO_ID"(+))&lt;br /&gt;&lt;br /&gt;Note: cpu costing is off&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Efectivamente, el coste del plan es mayor, pero REAL.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Sólo ha tardado 23 segundos!!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-5227229178679206102?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/5227229178679206102/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=5227229178679206102' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/5227229178679206102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/5227229178679206102'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/08/optimizacion-de-consultas-sql-en-oracle.html' title='Optimizacion de Consultas SQL en Oracle'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-3113082541085770572</id><published>2009-01-02T14:22:00.000-03:00</published><updated>2009-01-02T14:23:35.471-03:00</updated><title type='text'>Reparar Bloques corruptos</title><content type='html'>&lt;div class="entry-content"&gt;                &lt;div class="snap_preview"&gt;&lt;p&gt;Unos de los mas dificiles errores que nos podemos encontrar en una Base de datos es que surjan bloques de datos corruptos.&lt;/p&gt; &lt;p&gt;Si se nos presenta este error experimentaremos un incremento de tiempo en las queries o recibiriamos errores ORA-01498.&lt;/p&gt; &lt;p&gt;Oracle tiene varias herramientas que nos ayudan a identificar y fijar los datos corruptos que se estan dando en una base de datos:&lt;/p&gt; &lt;p&gt;a) ANALYZE TABLE table_name VALIDATE STRUCTURE.&lt;br /&gt;b) DBVERIFY.&lt;br /&gt;c) DB_BLOCK_CHECKING parametro.&lt;br /&gt;d) DBMS_REPAIR&lt;/p&gt; &lt;p&gt;&lt;strong&gt;ANALYZE TABLE&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Esta sentencia se utiliza para validar la estructura de los objetos. Si esta sentencia devuelva un error significa que existen bloques erroneos correspondientes a esa tabla.&lt;/p&gt; &lt;p&gt;sql&gt; &lt;strong&gt;analyze table MiSquema.Mitabla validate structure;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;UTILIDAD DBVERIFY&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;Se utiliza para validar si existen bloques corruptos en un determinado datafile. Es necesario indicarle mediante el&lt;strong&gt; &lt;/strong&gt;pametro &lt;strong&gt;blocksize &lt;/strong&gt;el tamaño del bloque que tenemos configurada en el parametro de inicializacion.&lt;/p&gt; &lt;p&gt;&gt;&lt;strong&gt;dbv blocksize=8192 file=MiDatafile.dbf&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;DB_BLOCK_CHEKING&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;DB_BLOCK_CHEKING es un parametro de inicializacion que obliga a hacer u testeo de los bloques de un tablespace cada vez que se va a hacer una modificacion.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;DBMS_REPAIR&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;Este paquete permite identificar y fijar los bloques corruptos en tablas e indices. Este paquete se corresponde de varios procesos almacenados:&lt;/p&gt; &lt;p&gt;CHECK_OBJECT: Detecta si existen bloques corruptos en tablas o indices.&lt;br /&gt;FIX_CORRUPT_BLOCKS: Marca aquellos bloques corruptos.&lt;br /&gt;DUMP_ORPHAN_KEYS: indica aquellos indices que eran apuntados por bloques corruptos.&lt;br /&gt;REBUILT_FREELISTS&lt;br /&gt;SEGMENT_FIX_STATUS&lt;br /&gt;SKIP_CORRUPT_BLOCKS: Se debe de utilizar para evitar el ORA-1578 que devolveria tras fijar un bloque corrupto.&lt;br /&gt;ADMIN_TABLES:&lt;/p&gt; &lt;p&gt;Vamos a simular la identificacion y fijado de datos corruptos dentro de una tabla:&lt;/p&gt; &lt;p&gt;sql&gt; &lt;strong&gt;connect / as sysdba&lt;br /&gt;&lt;/strong&gt;sql&gt; &lt;strong&gt;analyze table MiSquema.Mitabla validate structure;&lt;br /&gt;&lt;/strong&gt;SALIDA: ORA-1498&lt;br /&gt;Examinaremos el fichero de trazas para identificar el fichero corrupto:&lt;br /&gt;SALIDA: data_block_dump&lt;br /&gt;=============&lt;br /&gt;nrow=5&lt;br /&gt;Creamos una tabla de recuperación para almacenar la informacion devuelta por este paquete.&lt;/p&gt; &lt;p&gt;dbms_repair.&lt;strong&gt;dbms_tables&lt;br /&gt;(table_name=&gt;’REPAIR_TABLE’,&lt;br /&gt;table_type=&gt;dbms_reparir.repair_table,&lt;br /&gt;action=&gt; dbms_repair.create_action,&lt;br /&gt;tablespace=&gt;’USERS’&lt;br /&gt;);&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Comprobamos si existen bloques corruptos en la tabla.&lt;/p&gt; &lt;p&gt;DECLARE&lt;br /&gt;rpr_count int;&lt;br /&gt;BEGIN&lt;br /&gt;dbms_repair.&lt;strong&gt;check_object&lt;br /&gt;(schema_name =&gt;’MiSquema’,&lt;br /&gt;object_name=&gt;’MiTabla’,&lt;br /&gt;repair_table_name=&gt;’REPAIR_TABLE’,&lt;br /&gt;corrupt_count=&gt;rpr_count);&lt;br /&gt;&lt;/strong&gt;END&lt;/p&gt; &lt;p&gt;En rpr_count almacena el numero de bloques corruptos que ha encontrado.&lt;/p&gt; &lt;p&gt;La siguiente query muestra la informacion sobre el objeto afectado por el bloque corrupto.&lt;/p&gt; &lt;p&gt;sql&gt;&lt;strong&gt;select object_name, block_id, corrupt_type, marked_corrupt, from REPAIR_TABLE;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;Antes de marcar el bloque como no utilizable deberia hacerse un copia de seguridad de la tabla.&lt;/p&gt; &lt;p&gt;sql&gt;&lt;strong&gt; create table MiTable_back as&lt;br /&gt;select * from MiTable&lt;br /&gt;where dbms_rowid.rowid_block_number(rowid)=5&lt;br /&gt;and dbms_rowid.rowid_to_absolute_fno(rowid,’MiSquema’,'MiTable’)=4&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;Marcamos el bloque como no utilizable:&lt;/p&gt; &lt;p&gt;DECLARE&lt;br /&gt;fix_block_count int;&lt;br /&gt;BEGIN&lt;br /&gt;fix_block_count:=0;&lt;br /&gt;dbms_repair.&lt;strong&gt;fix_corrupt_blocks(&lt;br /&gt;schema_name=&gt;’MiSquema’,&lt;br /&gt;object_name=&gt;’MiTable’,&lt;br /&gt;object_type=&gt; dbms_repair.table_object,&lt;br /&gt;repair_table_name=&gt;’REPAIR_TABLE’,&lt;br /&gt;fix_count=&gt;fix_block_count);&lt;br /&gt;&lt;/strong&gt;END;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Referencia: http://mogukiller.wordpress.com/2008/12/26/reparar-bloques-corruptos/&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;/div&gt;         &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-3113082541085770572?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/3113082541085770572/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=3113082541085770572' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/3113082541085770572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/3113082541085770572'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/01/reparar-bloques-corruptos.html' title='Reparar Bloques corruptos'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-5712630369097461142</id><published>2009-01-02T14:20:00.000-03:00</published><updated>2009-01-02T14:21:41.430-03:00</updated><title type='text'>Oracle - Control de transacciones</title><content type='html'>CONTROL DE TRANSACCIONES&lt;br /&gt;&lt;br /&gt;DEFINICION: Conjunto de operaciones dependientes unas de otras que se realizan en la BD. Para que la transacción se ejecute, han de realizarse todas y cada una de las partes u operaciones que la componen; En el caso de que alguna falle se dará por fallida toda la transacción.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El usuario puede definir el comienzo y el fin de una transacción.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;EN ORACLE:&lt;br /&gt;&lt;br /&gt;.- Comienza la transacción con la 1º orden SQL de la sesión de usuario o con la 1º orden posterior a la finalización de la transacción anterior.&lt;br /&gt;&lt;br /&gt;.- Finaliza cuando se ejecuta un comando de control de transacción (commit o rollback) , una orden de definición de datos (DDL) o cuando finaliza la sesión.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Una vez concluida la transacción esta no se puede deshacer.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;COMANDOS DE CONTROL DE TRANSACION&lt;br /&gt;&lt;br /&gt;.-COMMIT: Da por concluida la transacción haciendo definitivos los cambios efectuados, liberando las filas bloqueadas. Solo después de que se ejecute un commit los demás usuarios tendrán acceso a los datos modificados.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.- ROLLBACK: Da por concluida la transacción deshaciendo los cambios efectuados y liberando las filas bloqueadas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.-ROLLBACK IMPLICITOS: Cuando  un programa falla y no se controla la excepción que produjo el fallo. Se deshacen todas las operaciones excepto aquellas que dentro del programa hayan sido confirmadas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.-SAVEPOINT &lt;punto de="" salvaguarda=""&gt;: Se usa con “rollback to” para marcar puntos de salvaguarda a la hora de procesar transacciones. Esto permitirá deshacer parte de una transacción.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.-ROLLBACK TO &lt;punto de="" salvaguarda=""&gt;: Deshace el trabajo realizado sobre la BD después del punto de salvaguarda. No obstante tampoco confirma el trabajo hecho hasta el punto de salvaguarda. La transacción en realidad no se confirma o rechaza hasta que aparece un commit o un rollback.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I1&lt;br /&gt;&lt;br /&gt;I2&lt;br /&gt;&lt;br /&gt;SAVEPOINT P1&lt;br /&gt;&lt;br /&gt;I3&lt;br /&gt;&lt;br /&gt;I4&lt;br /&gt;&lt;br /&gt;SAVEPOINT P2&lt;br /&gt;&lt;br /&gt;I5&lt;br /&gt;&lt;br /&gt;I6&lt;br /&gt;&lt;br /&gt;ROLLBACK TO P1&lt;br /&gt;&lt;br /&gt;COMMIT/ROLLBACK&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Los ámbitos de p1, p2 dependen del a transacción.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;·         TRANSACCIÓN AUTONOMA&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Son las que  se pueden confirmar o rechazar con independencia de lo que ocurre en la transacción en curso. Y viceversa, lo que ocurra con la transacción en curso no afecta a la autónoma.&lt;br /&gt;&lt;br /&gt;Se usan en pequeños programas o bloques.&lt;br /&gt;&lt;br /&gt;Se declaran en la sesión declarativa como:&lt;br /&gt;&lt;br /&gt;        PRAGMA AUTONOMOUS_TRANSACTION; (se crea la transacción autónoma)&lt;br /&gt;&lt;br /&gt;…………………………….&lt;br /&gt;&lt;br /&gt;Commit / rollback;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UPDATE&lt;br /&gt;&lt;br /&gt;UPDATE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;F(X)à pragma autonomous_transaction i1 i2 i3 i4 commit;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Rollback&lt;br /&gt;&lt;br /&gt;UPDATE&lt;br /&gt;&lt;br /&gt;UPDATE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;·         TRANSACIONES DE SOLO LECTURA&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Se usan para garantizar la consistencia de los datos recuperados entre distintas consultas frente a posibles cambios que puedan ocurrir entre ellas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El comienzo de una transacción de solo lectura se establece con SET TRANSACTION READ ONLY. Todas las consultas que se ejecuten después solamente verán aquellos cambios confirmados antes del comienzo de la transacción. (Como si hiciéramos una fotografía de la BD). Se confirma o rechaza con commit o rollback.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Antes del una transacción read only hay que hacer un rollback o commit o algo que finalice la transacción actual.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Rerenfia : http://www.lopezatienza.es/oracle/oracle-control-de-transacciones/&lt;br /&gt;&lt;br /&gt;&lt;/punto&gt;&lt;/punto&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-5712630369097461142?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/5712630369097461142/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=5712630369097461142' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/5712630369097461142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/5712630369097461142'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/01/oracle-control-de-transacciones.html' title='Oracle - Control de transacciones'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-5716720468923010080</id><published>2009-01-02T14:17:00.000-03:00</published><updated>2009-01-02T14:18:06.626-03:00</updated><title type='text'>Cambio en el comportamiento del GROUP BY in Oracle 10g</title><content type='html'>&lt;p&gt;Si usted recientemente actualizo su versión de base de datos oracle a la versión 10g, habrá notado que las consultas que agrupan (GROUP BY) le entrega los resultados en cualquier orden.&lt;/p&gt; &lt;p&gt;Pues bien, desde la versión oracle 10g el comportamiento de esta clausula ha cambiado con respecto a sus predecesores.  Ahora esta usando el nuevo mecanismo  HASH GROUP BY, el cual no garantiza que el resultado este en ningún orden a menos que utiliza la clausula “ORDER BY”.&lt;/p&gt; &lt;p&gt;Realicemos una prueba para verificar este comportamiento&lt;/p&gt; &lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;En Oracle 9i&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;SQL&gt; select owner,count(1) from dba_segments group by owner;&lt;/p&gt; &lt;p&gt;OWNER    COUNT(1)&lt;br /&gt;CTXSYS    76&lt;br /&gt;HR        25&lt;br /&gt;MDSYS    53&lt;br /&gt;ODM        82&lt;br /&gt;ODM_MTR    12&lt;br /&gt;OE        46&lt;br /&gt;OLAPSYS    149&lt;br /&gt;ORDSYS    7&lt;br /&gt;OUTLN    6&lt;/p&gt; &lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Plan de Ejecución&lt;/span&gt;&lt;/p&gt; &lt;p&gt;SELECT STATEMENT  CHOOSE&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; 50 SORT GROUP BY &lt;/span&gt;&lt;br /&gt;49 VIEW SYS.SYS_DBA_SEGS&lt;br /&gt;48 UNION-ALL&lt;br /&gt;……&lt;/p&gt; &lt;p&gt;&lt;span style="text-decoration: underline;"&gt;En Oracle 10g&lt;/span&gt;&lt;/p&gt; &lt;p&gt;SQL&gt; select owner,count(1) from dba_segments group by owner;&lt;/p&gt; &lt;p&gt;NEURONET     9&lt;br /&gt;HR2             34&lt;br /&gt;HABITAT         6&lt;br /&gt;MDSYS         125&lt;br /&gt;CTA_CTE1     392&lt;br /&gt;RMAN         132&lt;br /&gt;TSMSYS         4&lt;br /&gt;DMSYS         4&lt;br /&gt;DESIGNER6I     1902&lt;br /&gt;DESIGNERTEST 1903&lt;/p&gt; &lt;p&gt;&lt;span style="text-decoration: underline;"&gt;Plan de Ejecución&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;SELECT STATEMENT  ALL_ROWSCost: 1,689  Bytes: 23,562  Cardinality: 1,386&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; 45 HASH GROUP BY  Cost: 1,689  Bytes: 23,562  Cardinality: 1,386 &lt;/span&gt;&lt;br /&gt;44 VIEW VIEW SYS.SYS_DBA_SEGS Cost: 1,688  Bytes: 23,562  Cardinality: 1,386&lt;br /&gt;43 UNION-ALL&lt;br /&gt;……&lt;/p&gt; &lt;p&gt;Como podrá observarse, el primer resultado (oracle 9i) es entregado ordenado ascendentemente, mientras que el segundo (oracle 10g) resultado no tiene orden alguno&lt;/p&gt; &lt;p&gt;Se puede apreciar en los planes de ejecución que utilizan mecanismos distintos para resolver la consulta, mientras en la primera utiliza “SORT GROUP BY”, la segunda utiliza el nuevo mecanismo “HASH GROUP BY”.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Deshabilitando el “HASH GROUP BY” en oracle 10g&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Existen 2 maneras de deshabilitar este comportamiento del group by:&lt;br /&gt;Una es a nivel de session y otra a nivel de base de datos, aunque siempre es posible agregar el order by en las consultas que asi lo requieran.&lt;/p&gt; &lt;p&gt;A nivel de sesion se puede configurar el parametro oculto &lt;strong&gt;_gby_hash_aggregation_enabled&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;alter session set “_gby_hash_aggregation_enabled” = FALSE; &lt;/span&gt; para versión oracle 9i&lt;/p&gt; &lt;p&gt;A nivel de base de datos se puede configurar el parametro &lt;strong&gt;optimizer_features_enabled&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;alter system set optimizer_features_enable=’9.2.0′;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;alter system set optimizer_features_enable=’8.1.7′;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Estas ultimas configuracion, no requiere el reinicio de la base de datos.&lt;/p&gt; &lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;Referencias:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Nota Metalink : 345048.1&lt;br /&gt;&lt;a class="alignleft" href="http://searchoracle.techtarget.com/expert/KnowledgebaseAnswer/0,289625,sid41_gci1251893,00.html" target="_blank"&gt;http://searchoracle.techtarget.com/expert/KnowledgebaseAnswer/0,289625,sid41_gci1251893,00.html&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-5716720468923010080?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/5716720468923010080/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=5716720468923010080' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/5716720468923010080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/5716720468923010080'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/01/cambio-en-el-comportamiento-del-group.html' title='Cambio en el comportamiento del GROUP BY in Oracle 10g'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-5939351425868185294</id><published>2009-01-02T14:15:00.001-03:00</published><updated>2009-01-02T14:17:26.293-03:00</updated><title type='text'>Scripts de creación de Base de Datos Oracle 9i y 10g</title><content type='html'>&lt;p&gt;En ciertas circunstancias un DBA debe ser capaz de crear una base de datos Oracle sin ayuda de los utilitarios gráficos disponibles en Oracle (DBCA).&lt;/p&gt; &lt;p&gt;Es bueno experimentar con la creación manual de bases de datos Oracle, ya que entrega una experiencia que permite entender y decantar muchos conceptos en relación al funcionamiento del motor Oracle.&lt;/p&gt; &lt;p&gt;Este artículo describe las tareas que el DBA debe realizar para crear una base de datos en ambiente (Linux-Unix) haciendo uso solo de la clásica consola de administración sqlplus.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Pasos para crear una base de datos Oracle:&lt;/strong&gt;&lt;/p&gt; &lt;ol&gt;&lt;li&gt;Decidir  nombre único para la instancia, nombre de base de datos, tamaño del bloque Oracle, set de caracteres, número máximo de archivos de datos, y número máximo de archivos de redolog.&lt;/li&gt;&lt;li&gt; Decidir la estructura de almacenamiento físico de la base de datos (ASM, File System, Raw Devices) . En el ejemplo se usa almacenamiento por file system, y se han definido y creado los puntos de montaje de acuerdo al modelo OFA de Oracle.&lt;/li&gt;&lt;li&gt;Copiar y editar el archivo de parámetros (init.ora) que permite inicializar la instancia Oracle.&lt;/li&gt;&lt;li&gt;Configurar las variables apropiadas del sistema operativo (ORACLE_SID), otras variables tales como ORACLE_HOME, ORACLE_BASE deberian estar previamente definidas.&lt;/li&gt;&lt;li&gt;Crear archivo de password (según el valor que se haya definido para el parámetro REMOTE_LOGIN_PASSWORDFILE)&lt;/li&gt;&lt;li&gt;Invocar el SQLPLUS y conectarse a la base como sysdba.&lt;/li&gt;&lt;li&gt;Iniciar la instancia en estado NOMOUNT. En este estado se crea una base de datos nueva.&lt;/li&gt;&lt;li&gt;Crear la base de datos (ejecutar script de creación de la base de datos)&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;strong&gt;Ejemplo de archivo de parámetro inittest.ora&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;*.audit_file_dest=’/u01/app/oracle/admin/test/adump’&lt;br /&gt;*.background_dump_dest=’/u01/app/oracle/admin/test/bdump’&lt;/p&gt; &lt;p&gt;*.compatible=’10.2.0.1.0′&lt;/p&gt; &lt;p&gt;*.control_files=’/u02/oradata/test/control01.ctl’, ‘/u02/oradata/test/control02.ctl’,'/u02/oradata/test/control03.ctl’&lt;br /&gt;*.core_dump_dest=’/u01/app/oracle/admin/test/cdump’&lt;br /&gt;*.db_block_size=8192&lt;br /&gt;*.db_domain=’midominio.cl’&lt;br /&gt;*.db_file_multiblock_read_count=16&lt;br /&gt;*.db_name=’test’&lt;br /&gt;*.db_recovery_file_dest=’/u01/app/oracle/flash_recovery_area’&lt;br /&gt;*.db_recovery_file_dest_size=2147483648&lt;br /&gt;*.dispatchers=’(PROTOCOL=TCP) (SERVICE=testXDB)’&lt;br /&gt;*.job_queue_processes=10&lt;br /&gt;*.open_cursors=300&lt;br /&gt;*.pga_aggregate_target=92274688&lt;br /&gt;*.processes=150&lt;br /&gt;*.remote_login_passwordfile=’EXCLUSIVE’&lt;br /&gt;*.sga_target=277872640&lt;br /&gt;*.undo_management=’AUTO’&lt;br /&gt;*.undo_tablespace=’TS_UNDO’&lt;br /&gt;*.user_dump_dest=’/u01/app/oracle/admin/test/udump’&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Ejemplo de Creación Manual de Base de Datos Oracle 9i&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;En los ejemplos que vienen a continuación se ha preparado un archivo llamado inittest.ora que contiene los parámetros de la instancia llamada test.&lt;/p&gt; &lt;p&gt;u01/app/oracle/database/oracle9iR2/dbs &gt;sqlplus “/ as sysdba”&lt;/p&gt; &lt;p&gt;SQL*Plus: Release 9.2.0.2.0 - Production on Wed Apr 05 14:08:37 2006&lt;/p&gt; &lt;p&gt;Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.&lt;/p&gt; &lt;p&gt;Connected to an idle instance.&lt;/p&gt; &lt;p&gt;SQL&gt; startup nomount pfile=?/dbs/inittest.ora&lt;br /&gt;ORACLE instance started.&lt;/p&gt; &lt;p&gt;Total System Global Area  160925320 bytes&lt;br /&gt;Fixed Size                   730760 bytes&lt;br /&gt;Variable Size             109051904 bytes&lt;br /&gt;Database Buffers           50331648 bytes&lt;br /&gt;Redo Buffers                 811008 bytes&lt;/p&gt; &lt;p&gt;SQL&gt; CREATE DATABASE test&lt;br /&gt;LOGFILE group 1 (’/u01/oradata/test/redolog1a.dbf’,&lt;br /&gt;‘/u02/oradata/test/redolog1b.dbf’ ) SIZE 10M,&lt;br /&gt;group 2 (’/u01/oradata/test/redolog2a.dbf’,&lt;br /&gt;‘/u02/oradata/test/redolog2b.dbf’ ) SIZE 10M,&lt;br /&gt;group 3 (’/u01/oradata/test/redolog3a.dbf’,&lt;br /&gt;‘/u02/oradata /test/redolog3b.dbf’ ) SIZE 10M&lt;br /&gt;DATAFILE ‘/u02/oradata/test/system01.dbf’ SIZE 200M&lt;br /&gt;CHARACTER SET WE8ISO8859P1&lt;br /&gt;national character set utf8&lt;br /&gt;EXTENT MANAGEMENT LOCAL&lt;br /&gt;undo tablespace ts_undo&lt;br /&gt;datafile ‘/u02/oradata/test/undo01.dbf’&lt;br /&gt;size 50M&lt;br /&gt;default temporary tablespace ts_temp&lt;br /&gt;tempfile ‘/u02/oradata/test/temp01.dbf’&lt;br /&gt;size 50M autoextend on next 50M maxsize 300M;&lt;/p&gt; &lt;p&gt;Si se genera un error ORA-01031: insufficient privileges, eso significa que lo más probable, es que el usuario actual no está en el grupo dba (en unix), o en el grupo ORA_DBA (Windows).&lt;/p&gt; &lt;p&gt;Si el archivo init.ora no está en su ubicación por defecto o no se ha encontrado con el atributo pfile, se genera un error ORA-01078: failure in processing system parameters y  se emite un error LRM-00109: could not open parameter file ‘/u01/app/oracle/product/database/9.2.0/db_1/dbs/inittest.ora’&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Ejemplo de Creación Manual de Base de Datos Oracle 10g&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;/u01/app/oracle/product/database/10.2.0/db_1/dbs &gt;sqlplus “/ as sysdba”&lt;/p&gt; &lt;p&gt;SQL*Plus: Release 10.2.0.1.0 - Production on Wed Apr 05 14:08:37 2007&lt;/p&gt; &lt;p&gt;Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.&lt;/p&gt; &lt;p&gt;Connected to an idle instance.&lt;/p&gt; &lt;p&gt;SQL&gt; startup nomount pfile=?/dbs/inittest.ora&lt;br /&gt;ORACLE instance started.&lt;/p&gt; &lt;p&gt;Total System Global Area  160925320 bytes&lt;br /&gt;Fixed Size                   730760 bytes&lt;br /&gt;Variable Size             109051904 bytes&lt;br /&gt;Database Buffers           50331648 bytes&lt;br /&gt;Redo Buffers                 811008 bytes&lt;/p&gt; &lt;p&gt;SQL&gt; CREATE DATABASE test&lt;br /&gt;LOGFILE group 1 (’/u01/oradata/test/redolog1a.dbf’,&lt;br /&gt;‘/u02/oradata/test/redolog1b.dbf’ ) SIZE 10M,&lt;br /&gt;group 2 (’/u01/oradata/test/redolog2a.dbf’,&lt;br /&gt;‘/u02/oradata/test/redolog2b.dbf’ ) SIZE 10M,&lt;br /&gt;group 3 (’/u01/oradata/test/redolog3a.dbf’,&lt;br /&gt;‘/u02/oradata /test/redolog3b.dbf’ ) SIZE 10M&lt;br /&gt;DATAFILE ‘/u02/oradata/test/system01.dbf’ SIZE 200M&lt;br /&gt;CHARACTER SET WE8ISO8859P1&lt;br /&gt;national character set utf8&lt;br /&gt;EXTENT MANAGEMENT LOCAL&lt;br /&gt;sysaux datafile ‘/u02/oradata/test/sysaux01.dbf’&lt;br /&gt;size 300M&lt;br /&gt;autoextend on&lt;br /&gt;next 10M&lt;br /&gt;maxsize unlimited&lt;br /&gt;undo tablespace ts_undo&lt;br /&gt;datafile ‘/u02/oradata/test/undo01.dbf’&lt;br /&gt;size 50M&lt;br /&gt;default temporary tablespace ts_temp&lt;br /&gt;tempfile ‘/u02/oradata/test/temp01.dbf’&lt;br /&gt;size 50M autoextend on next 50M maxsize 300M;&lt;/p&gt; &lt;p&gt;El comando create database también ejecuta un archivo cuyo nombre es determinado por el parámetro de inicio (oculto) _init_sql_file. Después de la creación de la base de datos, ésta puede ser montada y abierta para su uso.&lt;/p&gt; &lt;p&gt;Una vez creada la base de datos cruda, se deben completar algunas tareas adicionales:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Tareas de post creación de la base de datos&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Una vez que se ha creado la base datos con el comando create database, ésta debe ser complementada con la ejecución de algunos scripts para crear el catálogo y la opción procedural que permite ejecutar programas PL/SQL.&lt;/p&gt; &lt;p&gt;Ejecute como SYS&lt;br /&gt;·    ?/rdbms/admin/catalog.sql&lt;br /&gt;·    ?/rdbms/admin/catproc.sql y&lt;/p&gt; &lt;p&gt;Donde ? representa un shortcut para el valor de la variable de ambiente $ORACLE_HOME (solo en sqlplus)&lt;/p&gt; &lt;p&gt;catalog.sql llama, por ejemplo, a catexp.sql que es un requisito para el utilitario exp que permite crear respaldos lógicos o dbmsstdx.sql que es un requisito para crear triggers.&lt;/p&gt; &lt;p&gt;El usuario  system también puede ejecutar ?/sqlplus/admin/pupbld.sql. pupbld.sql crea una tabla que permite bloquear a alguien más el uso de sqlplus.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-5939351425868185294?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/5939351425868185294/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=5939351425868185294' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/5939351425868185294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/5939351425868185294'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/01/scripts-de-creacin-de-base-de-datos.html' title='Scripts de creación de Base de Datos Oracle 9i y 10g'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-2735277982085824277</id><published>2009-01-02T14:14:00.002-03:00</published><updated>2009-01-02T14:15:11.905-03:00</updated><title type='text'>Mejorando el desempeño de consultas con QUERY REWRITE y Vistas Materializadas</title><content type='html'>Desde Oracle 8i existe una funcionalidad de la base de datos Oracle llamada QUERY REWRITE, en la cual en ciertas circunstancias de configuración de parámetros y objetos de base de datos, un SQL emitido por un usuario es re-escrito por otro equivalente que tiene mejor costo. En consecuencia esta funcionalidad tiene como requisito que el optimizador esté configurado como CBO.&lt;br /&gt;&lt;br /&gt;Un caso de aplicación frecuente en el uso de QUERY REWRITE se da en ambientes de datawarehouse, donde consultas que usan funciones de grupo sobre una fact table de millones de registros, pueden ser resueltas sobre una tabla de resumen (de cardinalidad mucho menor que la fact table) que contenga la misma información pero con mucho menos lecturas en disco.&lt;br /&gt;&lt;br /&gt;Las tablas de resúmenes indicadas se deben implementar con Vistas Materializadas para hacer uso de la característica de QUERY REWRITE.&lt;br /&gt;&lt;br /&gt;En un sistema de gestión de base de datos que siga el modelo relacional, una vista es una tabla virtual, que representa el resultado de una consulta. Siempre que se consulta o se actualiza una vista normal, el RDBMS convierte estas operaciones en consultas o actualizaciones de las tablas usadas para definir la vista.&lt;br /&gt;&lt;br /&gt;Una vista materializada utiliza una aproximación diferente: el resultado de la consulta se almacena en una tabla cache real, que será actualizada de forma periódica a partir de las tablas originales en las cuales se basa la vista materializada. Esto proporciona un acceso mucho más eficiente, a costa de un incremento en el tamaño de la base de datos y a una posible falta de sincronización, es decir, que los datos de la vista pueden estar potencialmente desfasados con respecto a los datos reales, lo cual en ambientes de gestión, que se usan para la toma de decisiones estratégicas y tácticas es un tema irrelevante.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;A continuación se creará una tabla objetos que hace el papel de fact table. Se crea a partir de una vista de catalogo Oracle que contiene un volumen importante de registros.&lt;br /&gt;&lt;br /&gt;REM Preparacion de tabla con volumen grande de registros&lt;br /&gt;&lt;br /&gt;sqlplus scott/tiger&lt;br /&gt;set echo on&lt;br /&gt;set termout off&lt;br /&gt;&lt;br /&gt;drop table objetos;&lt;br /&gt;&lt;br /&gt;create table objetos&lt;br /&gt;nologging&lt;br /&gt;as&lt;br /&gt;select * from all_objects&lt;br /&gt;union all&lt;br /&gt;select * from all_objects&lt;br /&gt;union all&lt;br /&gt;select * from all_objects&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;REM Se agregan mas datos a la tabla objetos para hacerla más voluminosa&lt;br /&gt;&lt;br /&gt;REM Se usa el mecanismo de DIRECT PATH para acelerar el proceso de poblamiento&lt;br /&gt;&lt;br /&gt;insert /*+ APPEND */ into objetos&lt;br /&gt;select * from objetos;&lt;br /&gt;commit;&lt;br /&gt;insert /*+ APPEND */ into objetos&lt;br /&gt;select * from objetos;&lt;br /&gt;commit;&lt;br /&gt;insert /*+ APPEND */ into objetos&lt;br /&gt;select * from objetos;&lt;br /&gt;commit;&lt;br /&gt;&lt;br /&gt;analyze table objetos compute statistics;&lt;br /&gt;select count(*) from objetos;&lt;br /&gt;&lt;br /&gt;REM Se hace una consulta con funciones de grupo sobre la tabla objetos.&lt;br /&gt;&lt;br /&gt;set autotrace on&lt;br /&gt;set timing on&lt;br /&gt;select owner, count(*) from objetos group by owner;&lt;br /&gt;&lt;br /&gt;OWNER                            COUNT(*)&lt;br /&gt;—————————— ———-&lt;br /&gt;CTXSYS                               6264&lt;br /&gt;ELAN                                 1272&lt;br /&gt;HR                                    816&lt;br /&gt;MDSYS                                5640&lt;br /&gt;ODM                                  9768&lt;br /&gt;…&lt;br /&gt;&lt;br /&gt;28 rows selected.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Elapsed: 00:00:07.06&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;———————————————————-&lt;br /&gt;0      SELECT STATEMENT Optimizer=CHOOSE&lt;br /&gt;(Cost=2719 Card=28 Bytes=140)&lt;br /&gt;1    0   SORT (GROUP BY) (Cost=2719 Card=28 Bytes=140)&lt;br /&gt;2    1     TABLE ACCESS (FULL) OF ‘OBJETOS’&lt;br /&gt;(Cost=1226 Card=708456 Bytes=3542280)&lt;br /&gt;&lt;br /&gt;Se observa que el costo de este primer plan de ejecución es alto debido a que la consulta requiere hacer un full table scan sobre una tabla de siete millones de registros, para solo recuperar finalmente 28 registros. ¿Qué se puede hacer? Crear una vista materializada basada en la consulta y habilitar query rewrite.&lt;br /&gt;&lt;br /&gt;REM Se le entrega privilegio de query rewrite al usuario SCOTT con el cual se va a trabajar&lt;br /&gt;&lt;br /&gt;sqlplus / as sysdba&lt;br /&gt;&lt;br /&gt;grant query rewrite to scott;&lt;br /&gt;&lt;br /&gt;REM Se activa para la sesión actual la capacidad de query rewrite&lt;br /&gt;&lt;br /&gt;sqlplus scott/tiger&lt;br /&gt;alter session set query_rewrite_enabled=true;&lt;br /&gt;alter session set query_rewrite_integrity=enforced;&lt;br /&gt;&lt;br /&gt;REM Notese que la vista materializada permite query rewrite&lt;br /&gt;&lt;br /&gt;create materialized view vm_resumen_objetos&lt;br /&gt;build immediate&lt;br /&gt;refresh on commit&lt;br /&gt;enable query rewrite&lt;br /&gt;as&lt;br /&gt;select owner, count(*)&lt;br /&gt;from objetos&lt;br /&gt;group by owner&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;REM Se generan estadísticas para la vista materializada (requisito de CBO)&lt;br /&gt;&lt;br /&gt;analyze table vm_resumen_objetos compute statistics;&lt;br /&gt;&lt;br /&gt;REM Ahora se ve en acción el efecto de la VM con la misma consulta en la que se basa la VM&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;set autotrace traceonly&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;select owner, count(*)&lt;br /&gt;from objetos&lt;br /&gt;group by owner;&lt;br /&gt;set autotrace off&lt;br /&gt;set timing off&lt;br /&gt;&lt;br /&gt;28 rows selected.&lt;br /&gt;&lt;br /&gt;Elapsed: 00:00:00.03&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;———————————————————-&lt;br /&gt;0      SELECT STATEMENT Optimizer=CHOOSE&lt;br /&gt;(Cost=2 Card=28 Bytes=252)&lt;br /&gt;1    0   TABLE ACCESS (FULL) OF ‘ VM_RESUMEN_OBJETOS ‘&lt;br /&gt;(Cost=2 Card=28 Bytes=252)&lt;br /&gt;&lt;br /&gt;Se observa que el costo de este segundo plan de ejecución es mucho menor que el costo que tenía el plan de ejecución original lo cual es resultado del gran impacto que tiene en el desempeño esta segunda consulta. Esta es la idea fundamental del QUERY REWRITE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-2735277982085824277?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/2735277982085824277/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=2735277982085824277' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/2735277982085824277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/2735277982085824277'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2009/01/mejorando-el-desempeo-de-consultas-con.html' title='Mejorando el desempeño de consultas con QUERY REWRITE y Vistas Materializadas'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-2251141771943641074</id><published>2008-09-23T19:01:00.001-04:00</published><updated>2008-09-23T19:09:48.937-04:00</updated><title type='text'>Storing Passwords In The Database 10G</title><content type='html'>&lt;h2&gt;DBMS_CRYPTO&lt;/h2&gt;  The &lt;code&gt;DBMS_CRYPTO&lt;/code&gt; package is a replacement for the &lt;code&gt;DBMS_OBFUSCATION_TOOLKIT&lt;/code&gt; package available in Oracle 8i and 9i. The new package is easier to use and contains more cryptographic algorithms:&lt;br /&gt;&lt;br /&gt;&lt;table bgcolor="#d8d8c4" border="1" cellpadding="2" cellspacing="1" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="25%"&gt;Source&lt;br /&gt;&lt;/td&gt;     &lt;td width="75%"&gt;&lt;span style="font-family:Courier;"&gt;{ORACLE_HOME}/rdbms/admin/dbmsobtk.sql&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cryptographic algorithms - DES, 3DES, AES, RC4, 3DES_2KEY&lt;/li&gt;&lt;li&gt;Padding forms - PKCS5, zeroes&lt;/li&gt;&lt;li&gt;Block cipher chaining modes - CBC, CFB, ECB, OFB&lt;/li&gt;&lt;li&gt;Cryptographic hash algorithms - MD5, SHA-1, MD4&lt;/li&gt;&lt;li&gt;Keyed hash (MAC) algorithms - HMAC_MD5, HMAC_SH1&lt;/li&gt;&lt;li&gt;Cryptographic pseudo-random number generator - RAW, NUMBER, BINARY_INTEGER&lt;/li&gt;&lt;li&gt;Database types - RAW, CLOB, BLOB&lt;/li&gt;&lt;/ul&gt;A simple example of it's usage is:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;SET SERVEROUTPUT ON&lt;br /&gt;DECLARE&lt;br /&gt;l_credit_card_no    VARCHAR2(19) := '1234 5678 9012 3456';&lt;br /&gt;l_ccn_raw           RAW(128) := UTL_RAW.cast_to_raw(l_credit_card_no);&lt;br /&gt;l_key               RAW(128) := UTL_RAW.cast_to_raw('abcdefgh');&lt;br /&gt;&lt;br /&gt;l_encrypted_raw     RAW(2048);&lt;br /&gt;l_decrypted_raw     RAW(2048);&lt;br /&gt;BEGIN&lt;br /&gt;DBMS_OUTPUT.put_line('Original  : ' || l_credit_card_no);&lt;br /&gt;&lt;br /&gt;l_encrypted_raw := DBMS_CRYPTO.encrypt(src =&gt; l_ccn_raw,&lt;br /&gt;                                       typ =&gt; DBMS_CRYPTO.des_cbc_pkcs5,&lt;br /&gt;                                       key =&gt; l_key);&lt;br /&gt;&lt;br /&gt;DBMS_OUTPUT.put_line('Encrypted : ' ||&lt;br /&gt;                           RAWTOHEX(UTL_RAW.cast_to_raw(l_encrypted_raw)));&lt;br /&gt;&lt;br /&gt;l_decrypted_raw := DBMS_CRYPTO.decrypt(src =&gt; l_encrypted_raw,&lt;br /&gt;                                       typ =&gt; DBMS_CRYPTO.des_cbc_pkcs5,&lt;br /&gt;                                       key =&gt; l_key);&lt;br /&gt;&lt;br /&gt;DBMS_OUTPUT.put_line('Decrypted : ' ||&lt;br /&gt;                          UTL_RAW.cast_to_varchar2(l_decrypted_raw));&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;Original  : 1234 5678 9012 3456&lt;br /&gt;Encrypted : 3041423134363932354234374545463631304337384433354443433736323331354244454237324635314545&lt;br /&gt;Decrypted : 1234 5678 9012 3456&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-2251141771943641074?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/2251141771943641074/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=2251141771943641074' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/2251141771943641074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/2251141771943641074'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2008/09/storing-passwords-in-database-10g.html' title='Storing Passwords In The Database 10G'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-4466343062538240599</id><published>2008-09-23T18:44:00.003-04:00</published><updated>2008-09-23T19:00:55.983-04:00</updated><title type='text'>Storing Passwords In The Database 8i to 9iR2</title><content type='html'>When security is managed within applications there is often a need to store passwords in database tables. This in itself can lead to security issues since people with appropriate privileges can read the contents of the security tables. A common approach to solving this is to encrypt the password before storing it. The problem with encryption is that it implies a possible decryption mechanism that could expose a hole in your security. A safer alternative is to store a hash of the username and password. In this article I'll present a simple example of this process using the &lt;code&gt;DBMS_OBFUSCATION_TOOLKIT&lt;/code&gt; package that is available in Oracle8i and Oracle9i:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Security Table&lt;/h2&gt;  First we must build a table to hold the security information:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;CREATE TABLE app_users (&lt;br /&gt;id        NUMBER(10)    NOT NULL,&lt;br /&gt;username  VARCHAR2(30)  NOT NULL,&lt;br /&gt;password  VARCHAR2(16)  NOT NULL&lt;br /&gt;)&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;ALTER TABLE app_users ADD (&lt;br /&gt;CONSTRAINT app_users_pk PRIMARY KEY (id)&lt;br /&gt;)&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;ALTER TABLE app_users ADD (&lt;br /&gt;CONSTRAINT app_users_uk UNIQUE (username)&lt;br /&gt;)&lt;br /&gt;/&lt;br /&gt;&lt;br /&gt;CREATE SEQUENCE app_users_seq&lt;br /&gt;/&lt;/pre&gt;&lt;/blockquote&gt;   &lt;h2&gt;Security Package&lt;/h2&gt;  Next we create the package that contains the specification of the security code:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;CREATE OR REPLACE PACKAGE app_user_security AS&lt;br /&gt;&lt;br /&gt;FUNCTION get_hash (p_username  IN  VARCHAR2,&lt;br /&gt;                   p_password  IN  VARCHAR2)&lt;br /&gt;  RETURN VARCHAR2;&lt;br /&gt;&lt;br /&gt;PROCEDURE add_user (p_username  IN  VARCHAR2,&lt;br /&gt;                    p_password  IN  VARCHAR2);&lt;br /&gt;&lt;br /&gt;PROCEDURE change_password (p_username      IN  VARCHAR2,&lt;br /&gt;                           p_old_password  IN  VARCHAR2,&lt;br /&gt;                           p_new_password  IN  VARCHAR2);&lt;br /&gt;&lt;br /&gt;PROCEDURE valid_user (p_username  IN  VARCHAR2,&lt;br /&gt;                      p_password  IN  VARCHAR2);&lt;br /&gt;&lt;br /&gt;FUNCTION valid_user (p_username  IN  VARCHAR2,&lt;br /&gt;                     p_password  IN  VARCHAR2)&lt;br /&gt;  RETURN BOOLEAN;&lt;br /&gt;&lt;br /&gt;END;&lt;br /&gt;/&lt;/pre&gt;&lt;/blockquote&gt;  We then create the package body to define the actual operations:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;CREATE OR REPLACE PACKAGE BODY app_user_security AS&lt;br /&gt;&lt;br /&gt;FUNCTION get_hash (p_username  IN  VARCHAR2,&lt;br /&gt;                   p_password  IN  VARCHAR2)&lt;br /&gt;  RETURN VARCHAR2 AS&lt;br /&gt;BEGIN&lt;br /&gt;  RETURN DBMS_OBFUSCATION_TOOLKIT.MD5(&lt;br /&gt;    input_string =&gt; UPPER(p_username) || '/' || UPPER(p_password));&lt;br /&gt;END;&lt;br /&gt;&lt;br /&gt;PROCEDURE add_user (p_username  IN  VARCHAR2,&lt;br /&gt;                    p_password  IN  VARCHAR2) AS&lt;br /&gt;BEGIN&lt;br /&gt;  INSERT INTO app_users (&lt;br /&gt;    id,&lt;br /&gt;    username,&lt;br /&gt;    password&lt;br /&gt;  )&lt;br /&gt;  VALUES (&lt;br /&gt;    app_users_seq.NEXTVAL,&lt;br /&gt;    UPPER(p_username),&lt;br /&gt;    get_hash(p_username, p_password)&lt;br /&gt;  );&lt;br /&gt;&lt;br /&gt;  COMMIT;&lt;br /&gt;END;&lt;br /&gt;&lt;br /&gt;PROCEDURE change_password (p_username      IN  VARCHAR2,&lt;br /&gt;                           p_old_password  IN  VARCHAR2,&lt;br /&gt;                           p_new_password  IN  VARCHAR2) AS&lt;br /&gt;  v_rowid  ROWID;&lt;br /&gt;BEGIN&lt;br /&gt;  SELECT rowid&lt;br /&gt;  INTO   v_rowid&lt;br /&gt;  FROM   app_users&lt;br /&gt;  WHERE  username = UPPER(p_username)&lt;br /&gt;  AND    password = get_hash(p_username, p_old_password)&lt;br /&gt;  FOR UPDATE;&lt;br /&gt;&lt;br /&gt;  UPDATE app_users&lt;br /&gt;  SET    password = get_hash(p_username, p_new_password)&lt;br /&gt;  WHERE  rowid    = v_rowid;&lt;br /&gt;&lt;br /&gt;  COMMIT;&lt;br /&gt;EXCEPTION&lt;br /&gt;  WHEN NO_DATA_FOUND THEN&lt;br /&gt;    RAISE_APPLICATION_ERROR(-20000, 'Invalid username/password.');&lt;br /&gt;END;&lt;br /&gt;&lt;br /&gt;PROCEDURE valid_user (p_username  IN  VARCHAR2,&lt;br /&gt;                      p_password  IN  VARCHAR2) AS&lt;br /&gt;  v_dummy  VARCHAR2(1);&lt;br /&gt;BEGIN&lt;br /&gt;  SELECT '1'&lt;br /&gt;  INTO   v_dummy&lt;br /&gt;  FROM   app_users&lt;br /&gt;  WHERE  username = UPPER(p_username)&lt;br /&gt;  AND    password = get_hash(p_username, p_password);&lt;br /&gt;EXCEPTION&lt;br /&gt;  WHEN NO_DATA_FOUND THEN&lt;br /&gt;    RAISE_APPLICATION_ERROR(-20000, 'Invalid username/password.');&lt;br /&gt;END;&lt;br /&gt;&lt;br /&gt;FUNCTION valid_user (p_username  IN  VARCHAR2,&lt;br /&gt;                     p_password  IN  VARCHAR2)&lt;br /&gt;  RETURN BOOLEAN AS&lt;br /&gt;BEGIN&lt;br /&gt;  valid_user(p_username, p_password);&lt;br /&gt;  RETURN TRUE;&lt;br /&gt;EXCEPTION&lt;br /&gt;  WHEN OTHERS THEN&lt;br /&gt;    RETURN FALSE;&lt;br /&gt;END;&lt;br /&gt;&lt;br /&gt;END;&lt;br /&gt;/&lt;/pre&gt;&lt;/blockquote&gt;  The overloads of &lt;code&gt;VALID_USER&lt;/code&gt; allow the security check to be performed in a different manner.&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;GET_HASH&lt;/code&gt; function is used to hash the combination of the username and password. It always returns a &lt;code&gt;VARCHAR2(16)&lt;/code&gt; regardless of the length of the input parameters. This level of compression means that the hash value may not be unique, hence the unique constraint on the &lt;code&gt;USERNAME&lt;/code&gt; column.&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;DBMS_UTILITY.GET_HASH_VALUE&lt;/code&gt; function could be used to replace the &lt;code&gt;DBMS_OBFUSCATION_TOOLKIT.MD5&lt;/code&gt; function, but the hashing algorithm of the former is not garaunteed to stay constant between database versions.&lt;br /&gt;&lt;h2&gt;Testing&lt;/h2&gt;  First we create a new user:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;SQL&gt; exec app_user_security.add_user('fernandov','mypass');&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; select * from app_users;&lt;br /&gt;&lt;br /&gt;      ID USERNAME                       PASSWORD&lt;br /&gt;---------- ------------------------------ ----------------&lt;br /&gt;       1 fernandov                      f&gt;~âÝ♀?£åeÍ?+▄}&lt;/pre&gt;&lt;/blockquote&gt;           Next we check the &lt;code&gt;VALID_USER&lt;/code&gt; procedure:&lt;br /&gt;         &lt;blockquote&gt;&lt;pre&gt;SQL&gt; EXEC app_user_security.valid_user('fernandov','mypass');&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; EXEC app_user_security.valid_user('fernandov','abcd');&lt;br /&gt;&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-20000: Invalid username/password.&lt;br /&gt;ORA-06512: at "FVALENZUELA.APP_USER_SECURITY", line 37&lt;br /&gt;ORA-06512: at line 1&lt;/pre&gt;&lt;/blockquote&gt;  Next we check the &lt;code&gt;VALID_USER&lt;/code&gt; function:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;SQL&gt; SET SERVEROUTPUT ON&lt;br /&gt;SQL&gt; BEGIN&lt;br /&gt;2    IF app_user_security.valid_user('fernandov','mypass') THEN&lt;br /&gt;3      DBMS_OUTPUT.PUT_LINE('TRUE');&lt;br /&gt;4    ELSE&lt;br /&gt;5      DBMS_OUTPUT.PUT_LINE('FALSE');&lt;br /&gt;6    END IF;&lt;br /&gt;7  END;&lt;br /&gt;8  /&lt;br /&gt;TRUE&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; BEGIN&lt;br /&gt;2    IF app_user_security.valid_user('fernandov','abcd') THEN&lt;br /&gt;3      DBMS_OUTPUT.PUT_LINE('TRUE');&lt;br /&gt;4    ELSE&lt;br /&gt;5      DBMS_OUTPUT.PUT_LINE('FALSE');&lt;br /&gt;6    END IF;&lt;br /&gt;7  END;&lt;br /&gt;8  /&lt;br /&gt;FALSE&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt;&lt;/pre&gt;&lt;/blockquote&gt;  Finally we check the &lt;code&gt;CHANGE_PASSWORD&lt;/code&gt; procedure:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;SQL&gt; exec app_user_security.change_password('fernandov','mypass','password2');&lt;br /&gt;&lt;br /&gt;PL/SQL procedure successfully completed.&lt;br /&gt;&lt;br /&gt;SQL&gt; exec app_user_security.change_password('fernandov','abcd','abcd1');&lt;br /&gt;BEGIN app_user_security.change_password('tim','abcd','abcd1'); END;&lt;br /&gt;&lt;br /&gt;*&lt;br /&gt;ERROR at line 1:&lt;br /&gt;ORA-20000: Invalid username/password.&lt;br /&gt;ORA-06512: at "W2K1.APP_USER_SECURITY", line 47&lt;br /&gt;ORA-06512: at line 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PD:article original http://www.oracle-base.com/articles/9i/StoringPasswordsInTheDatabase9i.php&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-4466343062538240599?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/4466343062538240599/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=4466343062538240599' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/4466343062538240599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/4466343062538240599'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2008/09/storing-passwords-in-database.html' title='Storing Passwords In The Database 8i to 9iR2'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-8298407673978919491</id><published>2008-09-22T13:36:00.000-04:00</published><updated>2008-09-22T13:37:29.549-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASH'/><title type='text'>The Power of ASH (Active Session History)</title><content type='html'>Oracle 10g, brings many new features through which one can easily tune the bad sqls or also can diagnose the database performance issues.&lt;br /&gt;&lt;br /&gt;Using database metrics, active session history and time model views.&lt;br /&gt;&lt;br /&gt;Following query fetchs top sqls spent more on cpu/wait/io. (Thanks to Kyle Hailey for this script):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;select&lt;br /&gt;ash.SQL_ID ,&lt;br /&gt;sum(decode(ash.session_state,'ON CPU',1,0)) "CPU",&lt;br /&gt;sum(decode(ash.session_state,'WAITING',1,0)) -&lt;br /&gt;sum(decode(ash.session_state,'WAITING', decode(en.wait_class, 'User I/O',1,0),0)) "WAIT" ,&lt;br /&gt;sum(decode(ash.session_state,'WAITING', decode(en.wait_class, 'User I/O',1,0),0)) "IO" ,&lt;br /&gt;sum(decode(ash.session_state,'ON CPU',1,1)) "TOTAL"&lt;br /&gt;from v$active_session_history ash,v$event_name en&lt;br /&gt;where SQL_ID is not NULL and en.event#=ash.event#&lt;br /&gt;group by &lt;/span&gt;&lt;span style="font-family: courier new;"&gt;ash.SQL_ID;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SQL_ID CPU WAIT IO TOTAL&lt;br /&gt;------------- ---------- ---------- ---------- ----------&lt;br /&gt;bqts5m5y267ct 0 0 20 20&lt;br /&gt;4gd6b1r53yt88 0 16 1 17&lt;br /&gt;35rqnp0hn3p3j 0 13 0 13&lt;br /&gt;3shtm7x3a54qu 0 0 8 8&lt;br /&gt;0hf43mhpx086p 0 0 4 4&lt;br /&gt;&lt;br /&gt;Use any of v$sql to get the sql_text for one of the above sql_id.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;SELECT sql_text FROM v$sqlarea WHERE sql_id = 'bqts5m5y267ct';&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;dbms_xplan.display_awr can be used to extract the sql plan for this sql_id.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;SELECT * FROM table(dbms_xplan.display_awr('bqts5m5y267ct');&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The above scinario was done in Oracle 10g Re.2 on SunSolaris&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PD: article original http://jaffardba.blogspot.com/2006/11/power-of-ash-active-session-history.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-8298407673978919491?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/8298407673978919491/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=8298407673978919491' title='28 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/8298407673978919491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/8298407673978919491'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2008/09/power-of-ash-active-session-history.html' title='The Power of ASH (Active Session History)'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>28</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-3358375501131024757</id><published>2008-09-22T12:50:00.000-04:00</published><updated>2008-09-22T14:34:31.474-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tunning'/><title type='text'>Oracle enable row movement tips</title><content type='html'>&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt; &lt;span style="font-size:12;"&gt;    The "enable row movement" feature of Oracle is somewhat      confusing to beginners and this notes describes some times when      "enable row movement" is used.  For complete details, see      my book "&lt;a href="http://www.rampant-books.com/book_2005_1_awr_proactive_tuning.htm"&gt;Oracle  Tuning: The Definitive Reference&lt;/a&gt;"&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="BodyText"  style="margin: 0in 0in 0pt;font-family:Times New Roman;"&gt; &lt;span style="font-size:12;"&gt;Oracle has several commands to reclaim unused disk space for objects (tables and  indexes).  Using the "&lt;i&gt;alter table xxx shrink space compact"&lt;/i&gt; command also  has the benefit of making full-table scans run faster, as less block accesses  are required.  With standard Oracle tables, you can reclaim space with the  "alter table shrink space" command:&lt;/span&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;span style="font-size:12;"&gt; &lt;/span&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:12;"&gt;&lt;span style="font-size:78%;"&gt;  SQL&gt; alter table mytable enable row movement;&lt;br /&gt;Table altered&lt;br /&gt;&lt;br /&gt;SQL&gt; alter table mytable shrink space;&lt;br /&gt;Table altered&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt; &lt;h2   style="margin: 0in 0in 0pt;font-family:Times New Roman;font-size:12pt;"&gt;&lt;span style="font-size:12;"&gt; &lt;/span&gt;&lt;/h2&gt; &lt;h2   style="margin: 0in 0in 0pt;font-family:Times New Roman;font-size:12pt;"&gt; &lt;span style="font-size:12;"&gt;          &lt;span style="font-size:100%;"&gt;    &lt;!--[if gte vml 1]&gt;&lt;v:shapetype id="_x0000_t75" coordsize="21600,21600" spt="75" preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"&gt;  &lt;v:stroke joinstyle="miter"&gt;  &lt;v:formulas&gt;   &lt;v:f eqn="if lineDrawn pixelLineWidth 0"&gt;   &lt;v:f eqn="sum @0 1 0"&gt;   &lt;v:f eqn="sum 0 0 @1"&gt;   &lt;v:f eqn="prod @2 1 2"&gt;   &lt;v:f eqn="prod @3 21600 pixelWidth"&gt;   &lt;v:f eqn="prod @3 21600 pixelHeight"&gt;   &lt;v:f eqn="sum @0 0 1"&gt;   &lt;v:f eqn="prod @6 1 2"&gt;   &lt;v:f eqn="prod @7 21600 pixelWidth"&gt;   &lt;v:f eqn="sum @8 21600 0"&gt;   &lt;v:f eqn="prod @7 21600 pixelHeight"&gt;   &lt;v:f eqn="sum @10 21600 0"&gt;  &lt;/v:formulas&gt;  &lt;v:path extrusionok="f" gradientshapeok="t" connecttype="rect"&gt;  &lt;o:lock ext="edit" aspectratio="t"&gt; &lt;/v:shapetype&gt;&lt;v:shape id="_x0000_s1025" type="#_x0000_t75" style="'width:326.5pt;" bordertopcolor="this" borderleftcolor="this" borderbottomcolor="this" borderrightcolor="this"&gt;  &lt;v:imagedata src="t_enable_row_movement_files/image001.emz" title="" grayscale="t"&gt; &lt;/v:shape&gt;&lt;![endif]--&gt;&lt;!--[if !vml]--&gt;&lt;img style="width: 431px; height: 273px;" src="http://www.dba-oracle.com/t_enable_row_movement_files/image002.gif" shapes="_x0000_s1025" border="0" /&gt;&lt;!--[endif]--&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt; &lt;h2   style="margin: 0in 0in 0pt;font-family:Times New Roman;font-size:12pt;"&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-size:12;"&gt;&lt;br /&gt;Finding tables and indexes for shrinking&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt; &lt;p class="BodyText"   style="margin: 0in 0in 0pt;font-family:Times New Roman;font-size:12pt;"&gt; &lt;span style="font-size:12;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p class="BodyText"  style="margin: 0in 0in 0pt;font-family:Times New Roman;"&gt; &lt;span style="font-size:12;"&gt;The Oracle 10g segment advisor will recommend tables that will benefit from  shrinking and indexes that require rebuilding (to reclaim space). &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt; &lt;span style="font-size:12;"&gt;     &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt; &lt;span style="font-size:12;"&gt;    When you add the clause "enable row movement" to a create table      statement, you are giving Oracle permission to change the      ROWID's.  This allows Oracle to condense table rows and      make it easier to reorganize tables.  The enable row      movement clause in used within these features:&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt; &lt;span style="font-size:12;"&gt;     &lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;span style="font-size:12;"&gt; &lt;li&gt;  &lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt;  &lt;b&gt;Alter table xxx shrink space compact&lt;/b&gt; - When using Automatic Segment   Storage Management (ASSM, a.k.a. bitmap freelists) you can issue the "&lt;i&gt;alter   table xxx shrink&lt;/i&gt;" command. to compress the table rows into less data   blocks, and Oracle moves down the high water mark to release the space.    This makes full-table scans run faster.&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;  &lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt;  &lt;b&gt;Flashback table&lt;/b&gt; - Using the flashback table features requires "enable   row movement".&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;  &lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt;  &lt;b&gt;Table reorganization&lt;/b&gt; - An Oracle10g database can reclaim space within   data segments online without affecting the ability of end users to access   their data. The only thing that must be ensured before using online segment   reorganization capability is that the tablespaces have the Automatic Segment   Space Management (ASSM) and row movement features enabled. Oracle10g   introduces the ability to reclaim space from a segment by shrinking of the   segment. Shrinking a segment will make unused space available to other   segments in the tablespace and may improve the performance of queries and   DML operations.    &lt;span style="font-family:Times New Roman;"&gt;&lt;span style="color:black;"&gt;  &lt;span style=";font-family:Times New Roman;font-size:12;"  &gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt; &lt;/span&gt;&lt;/ul&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt; &lt;span style="font-size:12;"&gt;          &lt;span style="font-size:12;"&gt;    The segment shrink is an online operation where the table being  shrunk is open to queries and DML while the segment is being shrunk.  Additionally, segment shrink is performed in-place. This is a key advantage over  performing Online Table Redefinition for compaction and reclaiming space.    &lt;/span&gt;           &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt;&lt;span style="font-size:12;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;h2 style="margin: 0in 0in 0pt;" align="left"&gt; &lt;span style="font-size:12;"&gt;    &lt;span style="font-size:12;"&gt;Finding opportunities for enable      row movement&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt; &lt;span style="font-size:12;"&gt;     &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt; &lt;span style="font-size:12;"&gt;    &lt;span style="font-size:12;"&gt;With the introduction of the     &lt;span class="BodyTextItalicsChar2"&gt;alter table xxx shrink space      compact&lt;/span&gt; syntax, the DBA gets a powerful tool for      effective and easy database space management. However, the DBA      needs to know what data segments experience high space waste in      order to reclaim free space to the database and shrink segments.     &lt;/span&gt;&lt;span style="font-size:12;"&gt;     &lt;a href="http://www.dba-oracle.com/oracle10g_tuning/t_online_table_reorganization.htm"&gt;     This page&lt;/a&gt; shows scripts that can be run to identify      opportunities for using the "alter table shrink compact" command      and you can use the &lt;/span&gt;&lt;span style="font-size:12;"&gt;&lt;i&gt;     &lt;span class="BodyTextItalicsChar2"&gt;awr_list_seg_block_space.sql&lt;/span&gt;&lt;/i&gt;      script to report percentages of free space for data segments.&lt;/span&gt;&lt;span style="font-size:12;"&gt;     &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt; &lt;span style="font-size:12;"&gt;     &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt; &lt;span style="font-size:12;"&gt;    &lt;span style="font-size:12;"&gt;Caveat:  Using enable row      movement can corrupt any Oracle features that rely on ROWID,      such as nested tables, and they should be used with caution.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt;&lt;br /&gt;&lt;span style="font-size:12;"&gt;&lt;span style="font-size:12;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt;&lt;br /&gt;&lt;span style="font-size:12;"&gt;&lt;span style="font-size:12;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;" align="left"&gt;&lt;span style="font-size:12;"&gt;&lt;span style="font-size:12;"&gt;PD: &lt;/span&gt;&lt;/span&gt;article original : http://www.dba-oracle.com/t_enable_row_movement.htm&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-3358375501131024757?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/3358375501131024757/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=3358375501131024757' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/3358375501131024757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/3358375501131024757'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2008/09/oracle-enable-row-movement-tips.html' title='Oracle enable row movement tips'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5625177420526016054.post-8253167553151149046</id><published>2008-09-22T12:45:00.000-04:00</published><updated>2008-09-22T12:48:18.660-04:00</updated><title type='text'>Saber las Versiones de los Software que utilizas</title><content type='html'>&lt;p&gt;&lt;strong&gt;Of Versions and Figuring Them Out&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;One of the things that you come across quite frequently when you work with oracle support is to need to tell them the product versions or the platform versions which run your oracle applications.&lt;br /&gt;since it is possible for Oracle to simulate your environment completely or not aat all in most cases its vital that you feed them with as accurate information about your environment as possible.&lt;br /&gt;&lt;br /&gt;The current post focuses on getting the version information which are commonly asked by during a service request.&lt;br /&gt;&lt;br /&gt;I am categorizing this post into three sections&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Oracle Applications Components&lt;/li&gt;&lt;li&gt;Oracle Database Components&lt;/li&gt;&lt;li&gt;Operating System and Utilities&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;strong&gt;Oracle Applications Components&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Oracle Applications version.&lt;/strong&gt;&lt;br /&gt;You may never need this but in case you are looking at a new environment then the simplest way to figure out your application version is by navigating to&lt;br /&gt;Help-&gt; About Oracle Applications from any of the forms sessions.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Version of a Oracle Applications Form (fmx) or report&lt;/strong&gt;&lt;br /&gt;To find the version of any oracle applications files&lt;br /&gt;strings -a ICQTYED.fmx | grep Header  &lt;br /&gt;alternatively you can also use the &lt;strong&gt;adident&lt;/strong&gt; command&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Version of a Java class File&lt;/strong&gt;&lt;br /&gt;To find the version of a java class file&lt;br /&gt;$ strings &lt;enter&gt; | grep '$Header'&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;JDBC version&lt;/strong&gt;&lt;br /&gt;In your middle tier, edit the jserv.properties file located in the iAS_ ORACLE_HOME/Apache/Jserv/etc directory&lt;br /&gt;- Locate the wrapper.classpath that is pointing to the jdbc zip file&lt;br /&gt;/u01/applsam/samcomn/java/jdbc14.zip&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;How to find the Apache version?&lt;/strong&gt;&lt;br /&gt;Go to the $iAS/Apache/Apache/bin directory and enter the following command:&lt;br /&gt;$ httpd -version&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Version Of The OA Framework&lt;/strong&gt;&lt;br /&gt;To find out the version of your Oracle appplication Framework&lt;br /&gt;http://[host].[domain]:[portnumber]/OA_HTML/OAInfo.jsp&lt;br /&gt;OA Framework Version Information&lt;br /&gt;OA Framework Version 11.5.10.2CU.&lt;br /&gt;MDS Version 9.0.5.4.81 (build 481)&lt;br /&gt;UIX Version 2.2.18&lt;br /&gt;BC4J Version 9.0.3.13.51&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Oracle Application Product Version or Patch Set Level.&lt;/strong&gt;&lt;br /&gt;One of the most common things you will asked by your support engineer is the version or commonly known as the patch set level of your Oracle Applications product, while or after raising your service request. You can query this by logging on to your application database as the apss user.&lt;br /&gt;select patch_level from fnd_product_installations where patch_level like '%AD%';&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;OJSP Version&lt;/strong&gt;&lt;br /&gt;Log in to the application server as the applmgr user&lt;br /&gt;cd $OA_HTML&lt;br /&gt;edit the jtflogin.jsp file to add the following line&lt;br /&gt;OJSP Version: &lt;%= application.getAttribute("oracle.jsp.versionNumber") %&gt;&lt;br /&gt;clear your cache and bounce your apache server&lt;br /&gt;soruce the jtflogin.jsp from your browser&lt;br /&gt;http://hcslnx03.satyam.com:8002/OA_HTML/jtflogin.jsp&lt;br /&gt;OJSP Version: 1.1.3.5.2&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;XML Parser Version&lt;/strong&gt;&lt;br /&gt;You can find out the version of your XML Parser using the following query&lt;br /&gt;SQL&gt; select WF_EVENT_XML.XMLVersion() XML_VERSION&lt;br /&gt;  2  from sys.dual;&lt;br /&gt;XML_VERSION&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Oracle XDK Java      9.0.4.0.0      Production&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;XML Publisher Version&lt;/strong&gt;&lt;br /&gt;To check weather XML publisher is installed or not you can query the FND_PRODUCT_INSTALLATIONS table or you can lookup the &lt;br /&gt;reports in Oracle Applications Manager. You can find out the version for your XML publisher from the output of your report or  from MetaInfo.class file.&lt;br /&gt;$OA_JAVA/oracle/apps/xdo/common/MetaInfo.class.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;WorkFlow Version&lt;/strong&gt;&lt;br /&gt;You can find out the version of your workflow using the following query&lt;br /&gt;SQL&gt; select TEXT Version from WF_RESOURCES&lt;br /&gt;  2  where  TYPE = 'WFTKN' and NAME = 'WF_VERSION';&lt;br /&gt;VERSION&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;2.6.0&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Oracle Database Components&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Oracle RDBMS Version&lt;/strong&gt;&lt;br /&gt;You can query the version of your database user the dynamic view V$VERSION&lt;br /&gt;SQL&gt; SELECT * FROM V$VERSION;&lt;br /&gt;BANNER&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production&lt;br /&gt;PL/SQL Release 9.2.0.6.0 - Production&lt;br /&gt;CORE    9.2.0.6.0       Production&lt;br /&gt;TNS for Solaris: Version 9.2.0.6.0 - Production&lt;br /&gt;NLSRTL Version 9.2.0.6.0 - Production&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Version of OPATCH&lt;/strong&gt;&lt;br /&gt;$ perl $ORACLE_HOME/OPatch/opatch.pl version&lt;br /&gt;/oracle/product/v9.2.0.6_doeb10s/OPatch/opatch.pl version: 1.0.0.0.51&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Listener Version&lt;/strong&gt;&lt;br /&gt;$ lsnrctl version&lt;br /&gt;LSNRCTL for Solaris: Version 9.2.0.6.0 - Production on 06-JUL-2007 09:34:53&lt;br /&gt;Copyright (c) 1991, 2002, Oracle Corporation.  All rights reserved.&lt;br /&gt;Connecting to (ADDRESS=(PROTOCOL=TCP)(HOST=samsolx)(PORT=1527))&lt;br /&gt;TNSLSNR for Solaris: Version 9.2.0.6.0 - Production&lt;br /&gt;        TNS for Solaris: Version 9.2.0.6.0 - Production&lt;br /&gt;        Unix Domain Socket IPC NT Protocol Adaptor for Solaris: Version 9.2.0.6.0 - Production&lt;br /&gt;        Oracle Bequeath NT Protocol Adapter for Solaris: Version 9.2.0.6.0 - Production&lt;br /&gt;        TCP/IP NT Protocol Adapter for Solaris: Version 9.2.0.6.0 - Production,,&lt;br /&gt;The command completed successfully&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Operating Systems and Utilities&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Sun Solaris Version&lt;/strong&gt;&lt;br /&gt;To check the version of you Solaris you can use the following file.&lt;br /&gt;$ cat /etc/release&lt;br /&gt;                Solaris 8 2/02 Fujitsu_3 s28s_u7fjsv3wos_04 SPARC&lt;br /&gt;           Copyright 2002 Sun Microsystems, Inc.  All Rights Reserved.&lt;br /&gt;                           Assembled 08 December 2002&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;RedHat Linux Version&lt;/strong&gt;&lt;br /&gt;You can check the version and release of Linux from the following file&lt;br /&gt;view /etc/redhat-release&lt;br /&gt;Red Hat Enterprise Linux AS release 4 (Nahant Update 2)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Perl Version&lt;/strong&gt;&lt;br /&gt;You can use the perl -v or the perl - version command to find out the version of perl on your environment.&lt;br /&gt;$ perl -version&lt;br /&gt;This is perl, version 5.005_03 built for sun4-solaris&lt;br /&gt;Copyright 1987-1999, Larry Wall&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Java Version&lt;/strong&gt;&lt;br /&gt;To fine the version of Java used&lt;br /&gt;$ java -version&lt;br /&gt;java version "1.4.2_04"&lt;br /&gt;Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_04-b05)&lt;br /&gt;Java HotSpot(TM) Client VM (build 1.4.2_04-b05, mixed mode)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Version of Installed packages on Solaris&lt;/strong&gt;&lt;br /&gt;To find the version of the packages on Solaris&lt;br /&gt;$ pkginfo -i|grep perl&lt;br /&gt;application MCperl584            PERL 5.8.4 with Modules 64bit with Threads&lt;br /&gt;optional    VRTSperl             Perl 5.8.6 for VERITAS&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Version of Installed packages on Linux&lt;/strong&gt;&lt;br /&gt;To find the version of the packages on linux&lt;br /&gt;rpm -qa|grep &lt;package&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Kernel Version of Unix&lt;/strong&gt;&lt;br /&gt;You can find the version of your kernel on UNIX by the following command&lt;br /&gt;uname -a&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Bit of Operating System&lt;/strong&gt;&lt;br /&gt;You can check the bit size of your OS by using the following command&lt;br /&gt;$ isainfo -b&lt;br /&gt;64&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Bit of your Oracle Software&lt;/strong&gt;&lt;br /&gt;To check if your Oracle Binary is 32 bit or 64 bit you can use the file command on any of the oracle executables like&lt;br /&gt;$ file $ORACLE_HOME/bin/oracle&lt;br /&gt;/oracle/product/v9.2.0.6_doeb10s/bin/oracle:    ELF 32-bit MSB executable SPARC Version 1, dynamically linked, not stripped&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5625177420526016054-8253167553151149046?l=fdovalenzuela.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fdovalenzuela.blogspot.com/feeds/8253167553151149046/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5625177420526016054&amp;postID=8253167553151149046' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/8253167553151149046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5625177420526016054/posts/default/8253167553151149046'/><link rel='alternate' type='text/html' href='http://fdovalenzuela.blogspot.com/2008/09/saber-las-versiones-de-los-software-que.html' title='Saber las Versiones de los Software que utilizas'/><author><name>-. Luis Fernando Valenzuela L .-</name><uri>http://www.blogger.com/profile/01142900295023090513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_Z-a2fFz0nWA/SNfWxmY85CI/AAAAAAAAADU/sO8ZkVVbZds/S220/s1231357300_2213.jpg'/></author><thr:total>0</thr:total></entry></feed>
