h1

Una manera de guardar y comparar queries

February 7, 2010

Desde hace unas semanas estoy inmerso en un upgrade de 9iR2 a 10gR2, por question de sencillez y rapidez decidí usar el Real Application Testing para comparar los planes de ejecución las queries en las dos versiones, siempre puede haber cambios.

Durante la configuración del RAT se me surgió la idea de probar comparar las queries de una misma versión pero de las diferentes pruebas (de varias iteraciones) como una validación que se ha probado bien y el entorno de prueba es estable.

Es bastante sencillo

1. activar 10046 y capturar las sentencias, bind y planes de ejecución en prueba X.
2. activar 10046 y capturar las sentencias, bind y planes de ejecución en prueba Y.
3. crear una tabla de mapeo de objet_id y objet_name, exportarlo e importarlo en la 11gR2 (para RAT)
4. Cargar las trazas de la prueba X a la BD de 11gR2 (para RAT)
5. Cargar las trazas de la prueba Y a la BD de 11gR2 (para RAT)

Para paso 3:

create table mapping_table as
select object_id id, owner,substr(object_name,1,30) name
from dba_objects
where object_type not in (
‘CONSUMER GROUP’,'EVALUATION CONTEXT’,
‘FUNCTION’,'INDEXTYPE’,'JAVA CLASS’,
‘JAVA DATA’,'JAVA RESOURCE’,'LIBRARY’,
‘LOB’,'OPERATOR’,'PACKAGE’,
‘PACKAGE BODY’,'PROCEDURE’,'QUEUE’,
‘RESOURCE PLAN’,'SYNONYM’,'TRIGGER’,
‘TYPE’,'TYPE BODY’)
union all
select user_id id,username owner, null name from dba_users;

Para los pasos 4 y 5 se utiliza esto:


DECLARE
   mycur   DBMS_SQLTUNE.sqlset_cursor;
BEGIN
   DBMS_SQLTUNE.create_sqlset ('lsc_sieb_x');

   OPEN mycur FOR
      SELECT VALUE (p)
        FROM TABLE
                (DBMS_SQLTUNE.select_sql_trace
                         (DIRECTORY => 'PRUEBA_X_DIR',
                          file_name => 'sieb_%.trc',
                          mapping_table_name  => 'MAPPING_TABLE',
                          select_mode => DBMS_SQLTUNE.single_execution
                         )
                ) p;

   DBMS_SQLTUNE.load_sqlset (sqlset_name => 'lsc_sieb_x',
                             populate_cursor => mycur,
                             commit_rows => 1000
                            );

   CLOSE mycur;
END;
/

DECLARE
   mycur   DBMS_SQLTUNE.sqlset_cursor;
BEGIN
   DBMS_SQLTUNE.create_sqlset ('lsc_sieb_y');

   OPEN mycur FOR
      SELECT VALUE (p)
        FROM TABLE
                (DBMS_SQLTUNE.select_sql_trace
                          (DIRECTORY => 'PRUEBA_Y_DIR',
                           file_name => 'sieb_%.trc',
                            mapping_table_name => 'MAPPING_TABLE',
                           select_mode => DBMS_SQLTUNE.single_execution
                           )
                ) p;

   DBMS_SQLTUNE.load_sqlset (sqlset_name => 'lsc_sieb_y',
                             populate_cursor => mycur,
                             commit_rows => 1000
                            );

   CLOSE mycur;
END;
/

con esta query sacamos las queries que repiten en las dos pruebas, ordeno por buffer_gets y cpu porque el resto de metricas fluctuan bastante:

WITH dist_sql_id AS
     (SELECT   sql_id, COUNT (*)
          FROM dba_sqlset_statements
         WHERE sqlset_name in ('lsc_sieb_x', 'lsc_sieb_y')
      GROUP BY sql_id
        HAVING COUNT (*) > 1)
SELECT   a.sqlset_name, a.sql_id, executions, elapsed_time, cpu_time,
         buffer_gets, disk_reads, rows_processed, fetches,
         parsing_schema_name
    FROM dba_sqlset_statements a, dist_sql_id b
   WHERE a.sql_id = b.sql_id
     AND sqlset_name in ('lsc_sieb_x', 'lsc_sieb_y')
     AND parsing_schema_name = 'XXX'
ORDER BY 2, 1, 6, 5

Para procesar los datos de rendimiento podemos jugar con las funciones LAG(), LEAD(), añadir filtros como elapsed_time mayor que xxx segundos, buffer_gets, disk_reads etc.

Luego para comparar plan de ejecucion podemos utilizar la vista DBA_SQLSET_PLANS.

Basicamemte creo que es lo que hace SQL Performance Analyzer por debajo pero aqui lo hacemos más manual. Este método es sencillo y muy rapido, me acuerdo hace 4 años en un upgrade similar para llevar acabo todas estas tareas tardaba entre 6 a 8 semanas de trabajo y scripting para guardar y comparar 12000 queries.

En este upgrade tambien usare el TTS con Physical Standby ya que el tiempo de upgrade es muy reducido, 45 minutos. Con el método de TTS Y Physical Standby espero reducir el tiempo de upgrade a 9iR2 a 10gR2 a 15 minutos, esto ya sera otro post.

h1

Nuevo Metalink…. nuevo qué? Pero esto vale dinero?

November 10, 2009

Dos dias despues de entrar en funcionamiento (despues de 3 de modo lectura de la web) el nuevo web de soporte de Oracle (integrando varios webs en uno) esta resultando desastroso y doloroso para los usuarios.

Solo ha habido quejas, perfiles que han perdido accesos a los CSI, perdidas de lecturas de SR, imposible de logear a la web (a mucha gente se le queda colgado en 96% cargando el Flash).

Durante estos 3 dias en algunos accesos tambien se ha visto errores de este tipo:

ORA-00372: file 102 cannot be modified at this time ORA-01110: data file 102: ‘/u01/app/oracle/admin/mlrepap/db/metalink_08.dbf’

Este tipo de errores la verdad es que no deberian de mostrarse al publico

En fin, una actualizacion dolorosa y como siempre sufrimos los mismos…. el caso es que los clientes pagan para tener acceso a una web de soporte en condiciones

h1

Oracle Database 11gR2 disponibile

September 1, 2009

Hace aproximadamente 1 hora Oracle ha anunciado la disponibilidad inmediata de Oracle Database 11gR2!

Ya se puede descargar en OTN la versión de Linux x86 y x86-64, los de UNIX habrá que esperar un par de meses más.

h1

Patch Set Update, una nueva modalidad de parches

July 14, 2009

Hace mas o menos una semana Oracle ha anunciado que van a sacar periodicamente un acumulativo de parches criticos denominados Patch Set Update (PSU). Son mini packs parecidos a los Critical Patch Updates (CPU) que saldran cada trimestre y contienen los fixes para los bugs criticos y los propios CPU.

Estara disponible en la mayoria de plataformas, una de las excepciones es Windows porque ya viene siendo habitual un min pack por mes o dos meses en esta plataforma (los bundle patches).

El primer mini pack va a ser la 10.2.0.4.1 y happy patching! :D

h1

Restart RMAN Duplicate RAC/ASM to Single Instance/ASM

June 22, 2009

Recientemente he tenido la oportunidad de realizar un servicio de unos dias de refresco de entorno con RMAN.

La base de datos origen esta en RAC 10gR2 de dos nodos sobre ASM y ocupa 2TB. El objetivo es refrescar entorno de QA periodicamente, un par de veces al mes con datos de produccion, QA es un Single Instance con ASM.

Si no recuerdo mal Oracle 9i se introdujo la funcionalidad Restore Optimization, esta funcionalidad permite rearrancar un restore fallido sin tener que restaurar todos los datafiles (esquiva los que ya estan restaurados), muy util cuando tienes que restaurar un tamaño considerable y por cualquier error falla. El caso es que esta funcionalidad no funciona con ASM o mejor dicho Oracle Managed Files (ASM funciona con OMF) porque los nombre de los datafiles son autogenerados, cada vez que se ejecuta un restore siempre genera un nombre nuevo y esto impide que se detecte datafiles que ya estan restaurados y provoca duplicados de datafiles y sobre todo perdida de tiempo. Esto es por el bug 5683952 (pone fixed in 10.2.0.2 pero me parece que no es verdad).

El workaround es forzar los nombre de los datafiles que sean user managed files especificando set newname en el duplicate, esto generara un nombre estatico que a su vez se convierten en alias de ASM que apunta a los datafiles, por ejemplo

SET NEWNAME FOR DATAFILE 1 TO ‘+DG_DATA/BST/system01.dbf’;

+DG_DATA/BST/system01.dbf apunta a +DG_DATA/BST/datafile/system.262.688916473

Pero a nivel de diccionario de datos apunta a +DG_DATA/BST/system01.dbf y esto habilita Restore Optimization.

Por cierto hace poco escribi sobre backup de RMAN a discos de SATA que tiene un throughput de 20MB, en este caso el backup iba a cinta…. a una media de 100MB por segundo, flipo con la velocidad de los discos de SATA (ó los que cofniguran la cabina). Me inclino mas a segundo porque tengo discos SATA en mi PC y un RAID 0 de dos discos de 320GB da mucho mejor rendimiento…. No entiendo mucho de cintas pero creo que no hace falta ser un experto para saber que algo no esta bien :-)