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)