Generar y exportar datos de rendimiento PL/SQL en un archivo

Visual Expert puede analizar el rendimiento de su código PL/SQL y generar algunas estadísticas sobre su ejecución. Esta funcionalidad se basa en los datos que generará e incluirá en su proyecto Visual Expert.

La forma de generar estos datos depende de su configuración:

  • Si Visual Expert puede conectarse a la base de datos de su Oracle, NO NECESITA seguir este procedimiento. Sólo siga este artículo en su lugar.
  • Si Visual Expert NO PUEDE conectarse a Oracle - por ejemplo con una base de datos de producción alojada en un entorno separado - siga el procedimiento siguiente para generar un archivo que contenga los datos necesarios, e inclúyalo en su proyecto Visual Expert.
  1. Conectese al SYS como SYSDBA
  2. CONNECT / AS SYSDB
  3. Cree un directorio para escribir un archivo con datos de rendimiento
    Ejemplo: PERFDATADIR apuntará a "C:\DATA" como sigue:
  4. CREATE OR REPLACE DIRECTORY PERFDATADIR AS 'C:\ODATA';
  5. Conceda acceso de LECTURA Y ESCRITURA en el directorio creado anteriormente (PERFDATADIR) al usuario para ejecutar el paquete "VEPerfUtils".
    Ejemplo con el usuario PERFTEST:
  6. GRANT READ, WRITE ON DIRECTORY PERFDATADIR TO PERFTEST;
  7. Conceda la EJECUCIÓN DEL ARCHIVO UTL para ejecutar el paquete "VEPerfUtils".
    Ejemplo con el usuario PERFTEST:
  8. GRANT EXECUTE ON UTL_FILE TO PERFTEST;
  9. Conceda Select ON v_$SQL para leer los datos de rendimiento de ORACLE
    Ejemplo con el usuario PERFTEST:
  10. GRANT SELECT ON v_$sql TO PERFTEST;
  11. Conectese a la base de datos
    Ejemplo: Conectar con el usuario PERFTEST
     
  12. Crear el paquete VEPerfUtils ejecutando el script VEPerfUtils.PLSQL que aparece al final de este procedimiento.
     
  13. Ejecutar el procedimiento VEPERFUTILS.WRITEPERFORMANCEDATATOFILE, para leer y escribir los datos de rendimiento en un archivo
  14. DECLARE
    FILENAME NVARCHAR2(200);
    DIRECTORY NVARCHAR2(200);
    RECORDLIMIT NUMBER;
    BEGIN
    FILENAME := 'TestPerformanceData.veplsqlperf'; -- provide a filename. It must have the extension .veplsqlperf
    DIRECTORY := 'PERFDATADIR'; -- provide the name of the Directory object created in step #2
    RECORDLIMIT := NULL; -- provide a number to limit records or NULL to write all records
      		VEPERFUTILS.WRITEPERFORMANCEDATATOFILE(
        FILENAME => FILENAME,
        DIRECTORY => DIRECTORY,
        RECORDLIMIT => RECORDLIMIT
      );
    --rollback; 
    END;
    

 

Una vez que el archivo de rendimiento esté listo después de seguir el proceso mencionado, puede ser utilizado por Visual Expert. Para ello, haga los siguientes pasos:

  1. Abra su proyecto Oracle PL/SQL en Visual Expert.
  2. En el menú de cinta, vaya a Configuración > Gestionar el código fuente.
    Generar y exportar datos de rendimiento PL/SQL en un archivo
  3. Haga clic en "Añadir" para adjuntar su archivo de datos de rendimiento (*.veplsqlperf) como una nueva ubicación de código fuente.
    Generar y exportar datos de rendimiento PL/SQL en un archivo
  4. En el Asistente de Proyectos de Visual Expert, seleccione "carpetas y/o archivos" > localice el directorio 'PERFDATADIR' > archivo *.veplsqlperf para agregarlo como una nueva ubicación de código fuente. Haga clic en "Finalizar".
    Generar y exportar datos de rendimiento PL/SQL en un archivo
  5. Se añade una nueva entrada a la lista para el archivo *.veplsqlperf.
    Generar y exportar datos de rendimiento PL/SQL en un archivo
  6. Al cerrar este diálogo, Visual Expert le notificará que se debe refrescar el análisis del código. Haga clic en "Sí".
    Generar y exportar datos de rendimiento PL/SQL en un archivo
  7. Una vez completado el proceso de análisis, un nuevo análisis se carga automáticamente.
     
  8. Visite este artículo para aprovechar las últimas funcionalidades disponibles para analizar el desempeño:
    MEJORAR EL RENDIMIENTO DEL CÓDIGO.

 

==================== Source of the file VEPerfUtils.PLSQL =========================

create or replace PACKAGE BODY VEPerfUtils AS 
PROCEDURE WritePerformanceDataToFile(filename nvarchar2, directory nvarchar2, recordLimit number);
END;

/

create or replace PACKAGE BODY VEPerfUtils AS 

PROCEDURE WritePerformanceDataToFile(filename nvarchar2, directory nvarchar2, recordLimit number)
IS

cursor vsql is
	SELECT v.parsing_schema_name,v.EXECUTIONS, Round(v.elapsed_time / 1000, 3) as elapsed_time, v.sql_fulltext from 
	--PerfData
	v$sql 
	v; 

perfdata vsql%rowtype; 

verecord CLOB;
vetemprecord CLOB;
veRecordCounter number := 0;
outputFileName nvarchar2(2000);
colum_delimiter nvarchar2(10) := N'«'||N'¬'||N'»';
row_delimiter nvarchar2(10) := N'«'||N'®'||N'»';

fileReference    utl_file.file_type := NULL;
dataReadLength     NUMBER := 2000; 
startOffset  NUMBER := 1; 
dataLength  NUMBER ; 
dataBuffer    NVARCHAR2(2000); 
readCharsLen NUMBER := 0;
dataBufferLength NUMBER := 0;

BEGIN
  
    verecord := NULL; 
    outputFileName := filename || '.veplsqlperf';
    dbms_output.put_line('Opening :' || directory || outputFileName);
    
    --open file
    fileReference := utl_file.fopen_NCHAR(directory, outputFileName, 'a', 32760);

    	
    for perfdata in vsql loop 
      
      veRecordCounter := veRecordCounter + 1;

	IF (recordLimit IS NOT NULL AND veRecordCounter > recordLimit) THEN
	SYS.utl_file.fclose(fileReference);
	dbms_output.put_line('total records written :'||veRecordCounter);
	return;
	END IF;


      vetemprecord := nvl(perfdata.parsing_schema_name,'') || colum_delimiter
              	|| nvl(perfdata.EXECUTIONS, 0) || colum_delimiter 
                || nvl(perfdata.elapsed_time, 0) || colum_delimiter 
		|| nvl(perfdata.sql_fulltext, '') || colum_delimiter
		|| veRecordCounter 
		|| chr(10) || row_delimiter || chr(10);

  

      verecord := verecord || vetemprecord;
      
      IF (mod(veRecordCounter , 10) = 0) Then
	
	startOffset  := 1;
	dataLength  := nvl(dbms_lob.getlength(verecord), 0); 
	dataBuffer    := ''; 

	if(dataLength > 0) then
	
		while (startOffset < dataLength) 
		loop
			
			dataBuffer := '';
			if ((dataReadLength + startOffset) > dataLength) then
				readCharsLen := dataLength - startOffset + 1;
	dbms_lob.READ(verecord, readCharsLen, startOffset, dataBuffer);
			else
	dbms_lob.READ(verecord, dataReadLength, startOffset, dataBuffer);
			end if;

			dataBufferLength := length(dataBuffer);
			
			if(dataBufferLength > 0) then
				utl_file.putF_NCHAR(fileReference, dataBuffer);
				utl_file.fflush(fileReference);
			end if;
			
			startOffset := startOffset + dataReadLength;
		END LOOP;

		verecord := NULL;

	end if;

      End IF;
      
    end loop;

    
	startOffset  := 1;
	dataLength  := nvl(dbms_lob.getlength(verecord), 0); 
	dataBuffer    := ''; 

	if(dataLength > 0) then

		while (startOffset < dataLength) 
		loop
			
			dataBuffer := '';
			if ((dataReadLength + startOffset) > dataLength) then
				readCharsLen := dataLength - startOffset + 1;
dbms_lob.READ(verecord, readCharsLen, startOffset, dataBuffer);
			else
dbms_lob.READ(verecord, dataReadLength, startOffset, dataBuffer);
			end if;

			dataBufferLength := length(dataBuffer);
			
			if(dataBufferLength > 0) then
				utl_file.putF_NCHAR(fileReference, dataBuffer);
				utl_file.fflush(fileReference);
			end if;

			startOffset := startOffset + dataReadLength;
		END LOOP;

		verecord := NULL;

	end if;
    
	dbms_output.put_line('Completed writing Total Records to file:' || veRecordCounter);
    
--close file
utl_file.fclose(fileReference);

EXCEPTION
	WHEN OTHERS THEN
		--close file
		utl_file.fclose(fileReference);
		dbms_output.put_line('ERROR_STACK: ' || DBMS_UTILITY.FORMAT_ERROR_STACK);
		dbms_output.put_line('ERROR_BACKTRACE: ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
		DBMS_OUTPUT.put_line ( 'Error raised in: '|| $$plsql_unit ||' at line ' || $$plsql_line || ' - '||sqlerrm);
		dbms_output.put_line('Error Occurred');
		
		
END WritePerformanceDataToFile;
END VEPerfUtils;