Visual Expert peut analyser les performances de votre code PL/SQL et générer des statistiques sur son exécution. Cette fonctionnalité repose sur des données que vous allez générer et inclure dans votre projet Visual Expert.
La manière de générer ces données dépend de votre configuration :
CONNECT / AS SYSDB
CREATE OR REPLACE DIRECTORY PERFDATADIR AS 'C:\ODATA';
GRANT READ, WRITE ON DIRECTORY PERFDATADIR TO PERFTEST;
GRANT EXECUTE ON UTL_FILE TO PERFTEST;
GRANT SELECT ON v_$sql TO PERFTEST;
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;
Une fois que le fichier de performance est prêt, il peut être consommé dans votre Visual Expert. Pour cela, suivez les étapes suivantes :
==================== 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;