miércoles, 13 de febrero de 2013

Un poco de BULK COLLECT


Esta sentencia se encuentra habilitada en PL/SQL , ella nos permite leer varios registros en una tabla a través de un único acceso usando la instrucción BULK COLLECT. De esta manera, se logra minimizar el numero de accesos a la BD, de tal forma que se optimizara el rendimiento. Una de sus desventajas es que el consumo de memoria sera algo mayor, pero esto es compensado con la velocidad con la que se puede procesar gran cantidad de registros.

Aquí un ejemplo de su uso mediante un procedimiento almacenado:

-------------------------------------------------------------------------------------------------------------------

Create or Replace PROCEDURE procesar_Filas (limite_in IN PLS_INTEGER DEFAULT 25)
IS
-- la variable limite_in es el valor que indica de cuanto en cuanto procesara la informacion

    CURSOR productos_cur
    IS -- Indicamos el Query de los datos a procesar--
        SELECT idproducto, descripcion
        FROM Producto;
        --------------------------------------------
    -- Se declara una tipo de variable para
    -- el procesamiento de los datos---
    TYPE Productos_aat IS TABLE OF productos_cur%ROWTYPE
        INDEX BY PLS_INTEGER;
    -- Declaramos la variable ---
    l_Productos Productos_aat;
BEGIN  
    -- Abrimos el cursor
    OPEN productos_cur;
    LOOP
    -- Inicializamos la clausula Bulk Colect
    ---estableciendo el limite de procesamiento---
        FETCH productos_cur BULK COLLECT INTO l_Productos LIMIT limite_in;

        FOR indx IN 1 .. l_Productos.COUNT
        LOOP          
            /*-----Ejemplo de un dbms_output.put_line -----*/
            --dbms_output.put_line(l_Productos(indx).idproducto ||', ' ||l_Productos(indx).descripcion);
            --dbms_output.put_line('---');
             -----------------------------------------------------
             --  Aqui tambien puede ir una sentencia insert o   --
             --  lo que se dese hacer con este bloque de datos  --
             --  Ejm:                                           --
             -----------------------------------------------------   
            Insert into temp_datop
            values (l_Productos(indx).idproducto,  l_Productos(indx).descripcion);
           
        END LOOP;

        EXIT WHEN l_Productos.COUNT < limite_in;

   END LOOP;

   CLOSE productos_cur;
END procesar_Filas;

-------------------------------------------------------------------------------------------------------------------

Como se puede apreciar el limite de procesamiento se ha establecido dentro de una variable en el SP (limite_in), considero que lo mas optimo es procesar datos de 25 en 25, claro, este valor siempre puede ser mayor, pero lo recomendable es que no sobrepase los 100.

Espero este Post sea de su ayuda y si tienen alguna duda o comentario no duden en ponerla.
Saludos,




jueves, 29 de diciembre de 2011

Selects Anidados o Inner Join


Sé que muchos de nosotros, más de una vez, hemos usado selects anidados. ¿No saben a qué me refiero? Sí estas largas sintaxis:

Select   Nombres,
                apellidos,
                (Select descripción from ubigeo u where a.ubigeo = u.ubigeo) distrito,
                Dirección
From persona

Aunque parezca insignificante esta línea “(Select descripción from ubigeo u where a.ubigeo = u.ubigeo)” consume gran cantidad de recursos al momento de ejecutar la consulta. Esto debido a que por cada registro que devuelva su consulta se ejecutara el select de ubigeo, por ejemplo si su consulta devuelve 10 000 registros el servidor le hará select 10 000 veces a la tabla ubigeo. Quizá con pocos registros no noten la diferencia, pero cuando manejen una gran cantidad créanme que el tiempo de respuesta de sus consultas realmente SI IMPORTA.

Después de lo anteriormente expuesto la mejor manera de hacer ese select seria:

Select   P.Nombres,
                P.apellidos,
                U.descripción distrito,
                P.Dirección
From persona P
Inner Join Ubigeo U On P.ubigeo = U.ubigeo

Donde:

Después la cláusula “inner join” debe de ir la tabla con la que vamos a unir la consulta, luego con la cláusula “On” procedemos a indicar los campos clave para indexar  ambas tablas

De esta manera solo invocamos a la tabla una sola vez.
Cabe recomendar que para un mejor desempeño lo más recomendable es que los campos a indexar sean PK(Primary Key) o FK(Foreing Key).

El uso de Joins nos ayudara a mejorar el rendimiento de la consulta, ahorrando tiempo al momento de la ejecución.

martes, 4 de octubre de 2011

El comienzo de una idea llamada blog...


Umm a ver pues que intento con esto... pues tratar de poner mi granito de arena a cada una de las personas que como yo a veces se la pasan buscando uno que otro tip medio yuca en la web ya sea de Power Builder, PL/SQL o Transact SQL, sí, yo tambien al igual que todos me he pasado varias horas buscando, es por eso que empezare publicando alguna de las cosas que encuentre a ver si le sirve a la gente que pase por aqui....