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