Visual Expert は、PL/SQL コードのパフォーマンスを解析し、その実行に関する統計情報を生成できます。この機能は、Visual Expert プロジェクト内で生成されるデータに依存しています。
このデータの生成方法は、設定に依存します。
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;
上記のプロセスを実行してパフォーマンス ファイルの準備ができたら、Visual Expert 内で使用できます。それには、以下の手順に従ってください。
==================== 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;