Générer et Exporter des Données de Performance PL/SQL dans un fichier

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 :

  • Si Visual Expert PEUT se connecter à votre base de données Oracle, vous n'avez pas besoin de suivre les étapes suivantes. Suivez simplement cette procédure à la place.
  • Si Visual Expert NE PEUT PAS se connecter à Oracle (dans le cas d'une base de données de production hébergée dans un environnement séparé par exemple) suivez la procédure ci-dessous pour générer un fichier contenant les données requises, et l'inclure dans votre projet Visual Expert.
  1. Connectez-vous à SYS en tant que SYSDBA
  2. CONNECT / AS SYSDB
  3. Créez un répertoire pour écrire un fichier avec des données de performance
    Exemple : PERFDATADIR pointera vers "C:\ODATA" comme suit :
  4. CREATE OR REPLACE DIRECTORY PERFDATADIR AS 'C:\ODATA';
  5. Créez un utilisateur, par exemple PERFTEST
  6. Autorisez l'accès à l'utilisateur en LECTURE ET EN ÉCRITURE sur le répertoire créé (PERFDATADIR) pour exécuter le package "VEPerfUtils".
    Exemple avec l'utilisateur PERFTEST :
  7. GRANT READ, WRITE ON DIRECTORY PERFDATADIR TO PERFTEST;
  8. Autorisez EXECUTE ON UTL_FILE pour exécuter le paquet "VEPerfUtils".
    Exemple avec l'utilisateur PERFTEST :
  9. GRANT EXECUTE ON UTL_FILE TO PERFTEST;
  10. Autorisez SELECT ON v_$SQL pour lire les données de performance ORACLE
    Exemple avec l'utilisateur PERFTEST :
  11. GRANT SELECT ON v_$sql TO PERFTEST;
  12. Connexion à la base de données
    Exemple : Connexion avec l'utilisateur PERFTEST
     
  13. Créez le package VEPerfUtils en exécutant le script VEPerfUtils.PLSQL dont vous trouverez le code à la fin de cette procédure.
     
  14. Exécutez la procédure VEPERFUTILS.WRITEPERFORMANCEDATATOFILE, pour lire et écrire les données de performance dans un fichier.
  15. 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 le fichier de performances prêt en suivant la procédure décrite ci-dessus, il peut être intégré dans votre projet Visual Expert. Suivez ces étapes :

  1. Créez un nouveau projet Oracle PL/SQL.
    Create a new Oracle Project
  2. Ajoutez le dossier contenant votre code source et le fichier .veplsqlperf.
    Add PL/SQL source code folder
  3. Dans l'écran de sélection du dossier, sélectionnez le dossier, puis choisissez les deux extensions de fichier (.plsql et .veplsqlperf), et cliquez sur [Suivant].
    Oracle PL/SQL folder selection
    select both file extensions
  4. Entrez le nom et les détails de votre projet, puis terminez l'assistant en cliquant sur Suivant et Terminer.
    Enter oracle project name and details
  5. Sur le dernier écran, sélectionnez Ouvrir la configuration du projet et cliquez sur [Terminer].
    Open Project Setup
  6. Sélectionnez les éléments DB par défaut, entrez le nom du schéma par défaut, puis cliquez sur [OK].
    Select Default DB items
    enter the Default Schema Name
  7. Lorsqu'il vous est demandé d'actualiser l'analyse du code, cliquez sur [Oui]. Visual Expert rechargera et affichera l'analyse des performances du code Oracle.
    Refresh Oracle code analysis
    Reload Oracle Code Performance Analysis

 

==================== 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;

 

Plus d'informations sur Visual Expert Code Performance