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.

SELECT * FROM plsql_profiler_data WHERE runid = (SELECT MAX(runid) FROM plsql_profiler_runs);

Tècniques d'ajust

Indexació

L'ús d'índexs adequats pot millorar significativament el rendiment de les consultes SQL dins del codi PL/SQL.

CREATE INDEX idx_col1 ON my_table(col1);

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

  1. Crea un procediment que calculi la suma dels quadrats dels números de l'1 al 1000000.
  2. Utilitza DBMS_PROFILER per perfilat el procediment.
  3. Identifica les parts del codi que consumeixen més temps.
  4. 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.

© Copyright 2024. Tots els drets reservats