lunes, 17 de enero de 2011

Script - Trasponer_filas_a_columna.sql

Función plsql para transponer los resultados de una consultas (varias filas) al valor de una fila en una columna indicando un carácter separador:

create or replace FUNCTION transponer(vSQL VARCHAR2, vSEP varchar2)
RETURN VARCHAR2 IS
-- vSQL sql dinámico a lanzar cuyo resultado queremos separados por la cadena vSEP
-- vSQL debe devolver una sola columna tipo varchar2 y el total de bytes retornados no debe superar los 32000 y 4000 por registro.
TYPE cv_type IS REF CURSOR;
CV CV_TYPE;
V_RES_VALOR VARCHAR2(32000);
VALOR VARCHAR2(4000);
BEGIN
V_RES_VALOR:='XX';
OPEN CV FOR VSQL;
LOOP
    FETCH CV INTO VALOR;
    EXIT WHEN CV%NOTFOUND;
    IF V_RES_VALOR='XX' THEN
        V_RES_VALOR:=VALOR;
    ELSE
        V_RES_VALOR:=V_RES_VALOR||VSEP||VALOR;
    END IF;
END LOOP;
CLOSE CV;
RETURN V_RES_VALOR;
EXCEPTION
    WHEN OTHERS THEN
        IF SQL%NOTFOUND THEN             VALOR:='NO ENCONTRADO';
        ELSE
            VALOR:='ERROR EN LA CONSULTA, CONSULTE CON EL ADMINISTRADOR';
        END IF;
        IF nvl(length(V_RES_VALOR),0)=0  THEN
         V_RES_VALOR:=VALOR;
        ELSE
         V_RES_VALOR:=V_RES_VALOR||' '||VSEP||' '||VALOR;
        END IF;
    RETURN 'ERROR --> '||V_RES_VALOR;
END TRANSPONER;
/

Ejemplo de uso:

select transponer('SELECT table_name FROM user_tables WHERE ROWNUM <=100', '|') FROM DUAL;

TABLA1|TABLA2|TABLA_EJEMPLO|PRUEBA

Script - Snaps AWR con más accesos a disco

Detectamos el snap_id con mayor número de lecturas y escrituras físicas de las estadísticas AWR almacenadas.

select
b.snap_id, sum(b.ios-a.ios)
from
    (select snap_id, file#, phyrds+phywrts ios
    from
        dba_hist_filestatxs dhf) a,
    (select snap_id, file#, phyrds+phywrts ios
    from
        dba_hist_filestatxs dhf) b
where
    a.snap_id+1=b.snap_id        and
    a.file#=b.file#
group by a.snap_id order by 2   


select * from dba_hist_snapshot where snap_id=....

viernes, 7 de enero de 2011

Comando - Table_lock

alter table '||owner||'.'||table_name||' disable table lock;

Con este comando evitamos un nivel de enqueues o bloqueos en el motor oracle, los tipo TM, permitiendo agilizar estos procesos de gestión de bloqueos, las estadísticas del AWR que se mejoran son:

enqueue releases
enqueue requests

las cuales bajan muchísimo.

Con esta opción en tablas críticas OLTP, bajamos los requerimientos de CPU en sistemas cargados entre un 5-10%.

Hay que tener en cuenta que desabilitar el "table_lock" sobre una tabla implica no poder realizar operaciones DDL sobre ellas (truncate, alter ...) así hay que tenerlo en cuenta para sistemas que requieran este tipo de bloqueos, aunque también es una medida extra de seguridad.