En aquest tema, aprendrem com millorar el rendiment del codi PL/SQL mitjançant tècniques de perfilat i ajust. Aquestes tècniques ens permeten identificar colls d'ampolla i optimitzar el codi per a una execució més eficient.
Objectius
- Comprendre què és el perfilat i l'ajust de codi.
- Aprendre a utilitzar les eines de perfilat disponibles.
- Identificar i solucionar colls d'ampolla en el codi PL/SQL.
- Aplicar tècniques d'ajust per millorar el rendiment.
Què és el perfilat i l'ajust de codi?
El perfilat és el procés d'analitzar el codi per identificar les parts que consumeixen més recursos, com ara temps de CPU o memòria. L'ajust de codi implica modificar aquestes parts per millorar el rendiment global.
Eines de perfilat
Oracle proporciona diverses eines per al perfilat de codi PL/SQL, com ara:
- DBMS_PROFILER: Una utilitat integrada que permet recollir dades de perfilat.
- DBMS_HPROF: Una altra utilitat per al perfilat de codi PL/SQL, especialment útil per a aplicacions complexes.
Utilització de DBMS_PROFILER
Configuració inicial
Abans de començar a utilitzar DBMS_PROFILER, cal configurar-lo correctament.
-- Habilitar el paquet DBMS_PROFILER
EXEC DBMS_PROFILER.START_PROFILER('Nom_de_la_sessió');
-- Executar el codi PL/SQL que es vol perfilat
BEGIN
-- Codi PL/SQL
END;
/
-- Aturar el perfilat
EXEC DBMS_PROFILER.STOP_PROFILER;Exemple pràctic
Suposem que tenim un procediment que calcula la suma de números de l'1 al 1000000. Volem perfilat aquest procediment per veure on es consumeix més temps.
CREATE OR REPLACE PROCEDURE calc_sum IS
v_sum NUMBER := 0;
BEGIN
FOR i IN 1..1000000 LOOP
v_sum := v_sum + i;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Sum: ' || v_sum);
END;
/
-- Iniciar el perfilat
EXEC DBMS_PROFILER.START_PROFILER('calc_sum_session');
-- Executar el procediment
EXEC calc_sum;
-- Aturar el perfilat
EXEC DBMS_PROFILER.STOP_PROFILER;Anàlisi de resultats
Després d'executar el perfilat, podem consultar les taules de perfilat per analitzar els resultats.
Tècniques d'ajust
Indexació
L'ús d'índexs adequats pot millorar significativament el rendiment de les consultes SQL dins del codi PL/SQL.
Optimització de bucles
Evitar bucles innecessaris o utilitzar tècniques com la recollida massiva (bulk collect) pot reduir el temps d'execució.
-- Exemple de recollida massiva
DECLARE
TYPE num_tab IS TABLE OF NUMBER;
v_tab num_tab;
BEGIN
SELECT col1 BULK COLLECT INTO v_tab FROM my_table;
FOR i IN v_tab.FIRST..v_tab.LAST LOOP
DBMS_OUTPUT.PUT_LINE(v_tab(i));
END LOOP;
END;
/Utilització de memòria cau
L'ús de memòria cau per a resultats de consultes freqüents pot reduir el temps d'execució.
-- Exemple d'ús de memòria cau
CREATE OR REPLACE FUNCTION get_cached_value(p_key IN VARCHAR2) RETURN VARCHAR2 IS
v_value VARCHAR2(100);
BEGIN
SELECT value INTO v_value FROM my_cache_table WHERE key = p_key;
RETURN v_value;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- Codi per obtenir el valor i emmagatzemar-lo a la memòria cau
RETURN NULL;
END;
/Exercici pràctic
Exercici
- Crea un procediment que calculi la suma dels quadrats dels números de l'1 al 1000000.
- Utilitza DBMS_PROFILER per perfilat el procediment.
- Identifica les parts del codi que consumeixen més temps.
- Aplica tècniques d'ajust per millorar el rendiment.
Solució
-- Pas 1: Crear el procediment
CREATE OR REPLACE PROCEDURE calc_sum_of_squares IS
v_sum NUMBER := 0;
BEGIN
FOR i IN 1..1000000 LOOP
v_sum := v_sum + i * i;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Sum of squares: ' || v_sum);
END;
/
-- Pas 2: Iniciar el perfilat
EXEC DBMS_PROFILER.START_PROFILER('calc_sum_of_squares_session');
-- Pas 3: Executar el procediment
EXEC calc_sum_of_squares;
-- Pas 4: Aturar el perfilat
EXEC DBMS_PROFILER.STOP_PROFILER;
-- Pas 5: Consultar els resultats
SELECT * FROM plsql_profiler_data WHERE runid = (SELECT MAX(runid) FROM plsql_profiler_runs);Conclusió
En aquesta secció, hem après com utilitzar tècniques de perfilat i ajust per millorar el rendiment del codi PL/SQL. Hem vist com configurar i utilitzar DBMS_PROFILER, així com algunes tècniques d'ajust com la indexació, l'optimització de bucles i l'ús de memòria cau. Aquestes habilitats són essencials per a qualsevol desenvolupador de PL/SQL que vulgui escriure codi eficient i optimitzat.
Curs de PL/SQL
Mòdul 1: Introducció a PL/SQL
Mòdul 2: Fonaments de PL/SQL
- Estructura del bloc PL/SQL
- Variables i tipus de dades
- Estructures de control
- Cursors
- Gestió d'excepcions
