Last Updated on 30 Settembre 2019 by Roberto De Pedrini

Facciamo un breve riepilogo del funzionamento di questi due comandi:

  • RTVDSKINF è il comando che colleziona le informazioni relative alla spazio disco occupato da oggetti, librerie, … Una volta lanciato occorre aspettare un po’ di tempo per permettere al sistema operativo di estrarre le informazioni ed inoltre è in grado di girare con in input un intero ASP (*SYSBAS oppure IASP)
  • PRTDSKINF provvede a generare uno spoolfile che contiene l’elenco degli oggetti/librerie con indicazione di proprietario, peso, ultimo utilizzo, …

In assenza di qualcosa di più flessibile e dinamico la maggior parte degli amministratori di sistema li hanno utilizzati nel tempo per monitorare l’occupazione dei dischi.

Fortunatamente IBM a partire dalla V7R2 ha arricchito la libreria QSYS2 con funzioni capaci di recuperare informazioni sullo stato di salute del server tra cui la OBJECT_STATISTICS.

Questa UDTF permette di risalire in breve tempo al contenuto di una libreria o ad una parte di essa semplicemente con una query SQL di selezione e quindi permette un controllo più capillare e nettamente più veloce di ciò che succede all’interno delle librerie.

Sintassi

La sintassi per l’utilizzo di questa funzione è la seguente

OBJECT_STATISTICS(nomeLibreria, listaTipiOggetto, nomeOggetto)

In dettaglio i parametri per l’utilizzo di questa UDTF sono:

  • nomeLibreria: può contenere il nome di una libreria presente du disco oppure uno dei seguenti valori speciali (*ALL, *ALLUSR, *ALLUSRAVL, *CURLIB, *LIBL, *USRLIBL)
  • listaTipiOggetto: può contenere uno o più tipi oggetto (anche senza il carattere * davanti) seperati da uno spazio o da una virgola
  • nomeOggetto(opzionale): può contenere il nome di un oggetto

Esempi

Di seguito alcuni esempi di utilizzo:

  • Spazio occupato in bytes da una libreria
SELECT SUM(OBJSIZE) FROM TABLE (QSYS2.OBJECT_STATISTICS('PETRIS','ALL')) T 
  • Lista oggetti di tipo file per proprietario contenuti in una libreria
SELECT OBJNAME, OBJTEXT, OBJOWNER FROM TABLE (QSYS2.OBJECT_STATISTICS('PETRIS','FILE')) T WHERE OBJATTRIBUTE = 'PF' ORDER BY OBJOWNER
  • Lista oggetti non utilizzati presenti nella parte utente della lista librerie del job utilizzati al massimo una volta ordinati per peso decrescente
SELECT * FROM TABLE (QSYS2.OBJECT_STATISTICS('USRLIBL','ALL')) T WHERE  DAYS_USED_COUNT <= 1 ORDER BY OBJSIZE DESC

Per un controllo completo di tutto ciò che è installato sul server è possibile anche creare una tabella da popolare con il contenuto di ogni singola libreria e poi ragionare anche con strumenti di Business Intelligence per creare un cruscotto di controllo del nostro IBMi.

Creiamo una tabella che conterrà tutte le informazioni

CREATE TABLE PETRIS.OBJECTS (                      
   NAME VARCHAR(10) NOT NULL DEFAULT '' ,     
   TYPE VARCHAR(8) NOT NULL DEFAULT '' ,      
   OWNER VARCHAR(10) NOT NULL DEFAULT '' ,     
   CREATOR VARCHAR(10) NOT NULL DEFAULT '' ,     
   CREATED TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,  
   SIZE DECIMAL(15, 0) NOT NULL DEFAULT 0 ,             
   TEXT VARCHAR(50) DEFAULT NULL ,            
   SQL_NAME VARCHAR(128) DEFAULT NULL ,           
   USED TIMESTAMP DEFAULT NULL ,                        
   DAYS_USED DECIMAL(10, 0) NOT NULL DEFAULT 0 ,             
   RESET TIMESTAMP DEFAULT NULL ,                        
   ASP_NUMBER DECIMAL(5, 0) NOT NULL DEFAULT 0 ,              
   ATTRIBUTE VARCHAR(10) NOT NULL DEFAULT '' ,     
   SQL_SCHEMA VARCHAR(128) NOT NULL DEFAULT '' ,    
   LIBRARY_TEXT VARCHAR(50) DEFAULT NULL ,            
   SQL_TYPE VARCHAR(9) DEFAULT NULL )           

Poi creiamo un nuovo programma che:

  • pulisca il contenuto della tabella
TRUNCATE TABLE PETRIS.OBJECTS 
  • apra un cursore e faccia inizialmente un loop sulla vista SYSSCHEMAS
SELECT SCHEMA_NAME FROM QSYS2.SYSSCHEMAS

e per ogni libreria letta esegua il popolamento estraendo i dati da OBJECT_STATISTICS

INSERT INTO PETRIS.OBJECTS(SELECT OBJNAME, OBJTYPE, OBJOWNER, OBJDEFINER, OBJCREATED, 
 OBJSIZE, OBJTEXT, OBJLONGNAME, LAST_USED_TIMESTAMP, DAYS_USED_COUNT, LAST_RESET_TIMESTAMP, 
 IASP_NUMBER, OBJATTRIBUTE, OBJLONGSCHEMA, TEXT, SQL_OBJECT_TYPE 
 FROM TABLE(QSYS2.OBJECT_STATISTICS('nomeLibreria','*ALL')))

NB: al limite si può valutare di escludere le librerie di proprietà dell’utente QSYS per evitare di estrarre quelle del sistema operativo (SELECT SCHEMA_NAME FROM QSYS2.SYSSCHEMAS WHERE SCHEMA_OWNER <> ‘QSYS’)

Una volta ottenuta la lista completa degli oggetti è semplice scovare gli oggetti che occupano più spazio, le librerie più pesanti, ecc…

SELECT SQL_SCHEMA, SUM(SIZE) FROM PETRIS.OBJECTS GROUP BY SQL_SCHEMA ORDER BY 2 DESC

Riferimenti

Per ulteriori informazioni è disponibile la documentazione ufficiale IBM (https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/rzajq/rzajqudfobjectstat.htm)

Related Posts
DB2 for i SQL – Stringhe – POSSTR-LOCATE-LOCATE_IN_STRING (IT)

Introduzione Spesso, nelle nostre applicazioni, abbiamo la necessità di lavorare con le stringhe di testo e l'SQL del DB2 può Read more

DB2 for i & SQL – FAQ & Howto (Part. 1) (IT)

Database DB2 e SQL ... forse lo strumento più potente e completo che abbiamo sulla piattaforma IBM i: ecco una Read more

Annuncio IBM i 7.4

Arriva direttamente con l'uovo di Pasqua questo annuncio IBM per le novità della versione IBM i 7.4, versione iNext secondo Read more

Generated Always Columns – Approfondimenti (IT)

Introduzione "Generated Always Column": sono colonne, campi, di una tabella il cui contenuto è controllato direttamente dal sistema ... e Read more

About author

Head of Application development & Systems integration da sempre lavoro su "i". Programmatore, analista, project manager, sistemista, ... tanti cappelli ma un'unica piattaforma preferita. Collaboro con la community FAQ400 perchè credo fermamente nel lavoro di squadra e auspico una crescita continua e costante dell'ecosistema di cui mi sento parte.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *