Bind DSNCLINF

Massimiliano Valli

Bind DSNCLINF

Buongiorno a tutti,

 

abbiamo notato dalla nostra reportistica che da un consumo importante della cpu da parte di LDAP (presente su host e avente base dati su db2) c'è un corrispettivo consumo di cpu del package DSNCLINF. Questo packege risulta  maggiormente usato propro dall'LDAP.

Leggendo su qualche forum in rete, alcuni utenti hanno provato a bindare il CLINF con la option REOPT(ALWAYS), piuttosto che ONCE o AUTO, Allo stato attuale la nostra config punta su REOPT(NONE), 

E' possibile avere una diminuzione dei consumi alterando questo parametro?

 

Al momento abbiamo db2 v10 sui sottosistemi di prod e db2 v11 cm mode nei db2 di svilluppo.

 

Come sempre, grazie per l'aiuto. 

Angelo Sironi

R: Bind DSNCLINF
(in response to Massimiliano Valli)
Noi l’abbiamo fatto, ma selettivamente a livello dello query SQL usando gli hint. E, salvo una o due eccezioni, abbiamo avuto sempre beneficio anche significativo. Farlo in modo generalizzato (a livello dell’intero Package) può risultare controproducente se il Package contiene ed esegue molte query diverse e molte di queste non hanno bisogno di essere re-bound prima di ogni esecuzione.



Suggerisco di effettuare un monitoraggio a livello degli stmt. SQL per evidenziare quelli che presentano problema (i tool disponibili sono CA Detector, BMC Apptune e IBM Query Monitor, per citare quelli che conosco). Se tutte le query eseguite (o, comunque, tutte quelle che presentano una frequenza di esecuzione maggiore) presentano problemi di performance, allora vale la pena di effettuare il REBIND del Package con REOPT(ALWAYS). Se, invece, il problema è presente solo in qualche query, allora la soluzione ottimale è quella di usare un hint di REOPT per ognuna delle query che ne ha bisogno.



Se non disponete di nessuno dei tool citati (e di nessun altro simile), potete comunque provare con il rebind del Package. SE non ottenete beneficio, tornate indietro con un ulteriore rebind.



A presto,

Angelo



Da: Massimiliano Valli [mailto:[login to unmask email]
Inviato: venerdì 11 novembre 2016 10:47
A: [login to unmask email]
Oggetto: [DB2UGITALY] - Bind DSNCLINF



Buongiorno a tutti,



abbiamo notato dalla nostra reportistica che da un consumo importante della cpu da parte di LDAP (presente su host e avente base dati su db2) c'è un corrispettivo consumo di cpu del package DSNCLINF. Questo packege risulta maggiormente usato propro dall'LDAP.

Leggendo su qualche forum in rete, alcuni utenti hanno provato a bindare il CLINF con la option REOPT(ALWAYS), piuttosto che ONCE o AUTO, Allo stato attuale la nostra config punta su REOPT(NONE),

E' possibile avere una diminuzione dei consumi alterando questo parametro?



Al momento abbiamo db2 v10 sui sottosistemi di prod e db2 v11 cm mode nei db2 di svilluppo.



Come sempre, grazie per l'aiuto.



-----End Original Message-----

Massimiliano Valli

RE: R: Bind DSNCLINF
(in response to Angelo Sironi)

Ciao Angelo,

 

abbiamo seguito il tuo consiglio. Provando a rebindare il DSNCLINF con REOPT(ALWAYS), abbiamo aimè avuto un peggioramento dei consumi di CPU del package  e delle singole query del LDAP che a noi premeva ottimizzare. 

Cosi, siamo tornati indietro e abbiamo percorso la strada della HINT a livello di statment sql, inserendo una riga nella DSN_USERQUERY_TABLE e eseguendo il comando di BIND QUERY. In quest'ultimo passo abbiamo dei problemi legato al contenuto del campo QUERY_TEXT. 

In particolare abbiamo:

DSNT281I -DB1C BIND QUERY FOR QUERYNO = 99999 NOT SUCCESSFUL,
REASON: 3. THE STATEMENT TEXT CONTAINS AN ERROR. 

Sicuramente è legato alla fattezza della query inserita, ma non capiamo dove può essere l'errore. 

Ti scrivo la query: 

SELECT e.DN , e.EID
FROM USTLDAP2.DIR_ENTRY AS e
WHERE e.EID IN (
SELECT S.EID
FROM USTLDAP2.DIR_SEARCH AS S , USTLDAP2.DIR_SEARCH AS S1
WHERE ( S.ATTR_ID = 32
AND S.VALUE IN ( X'41434345535347524F555000' ,
X'414343455353524F4C4500' , X'49424D2D53544154494347524F555000'
, X'47524F55504F464E414D455300' ,
X'47524F55504F46554E495155454E414D455300' ) )
AND S.EID = S1.EID
AND ( ( S1.ATTR_ID = 24
OR S1.ATTR_ID = 47 )
AND S1.VALUE = ?
AND S1.LVALUE = ? ) ) FOR FETCH ONLY WITH CS

Inserendo altre query (più semplici) il bind è andato correttamente. 

 

Ancora grazie per l'aiuto 

Angelo Sironi

R: R: Bind DSNCLINF
(in response to Massimiliano Valli)
Ciao Massimiliano,

Il BIND Query è molto delicato… Pretende che il testo della query sia esattamente quello che usa internamente il DB2. Se la query è in SQL statico, va presa dalla SYSIBM.SYSPACKSTMT; se dinamica, dalla Dyn. Stmt. Cache.

Per l’SQL Dinamico il metodo più semplice è catturare il contenuto della cache con il comando di Explain e copiare con da lì il testo della query.



AL DI LA’ di questo, quello che mi stupisce, da quello che dici, è che nessuna delle query ha mostrato beneficio. Se le cose stanno così, non ne avrai neppure usando un hint. In tale situazione, la prima cosa da fare è capire per quale motivo non si è avuto beneficio. Se, giusto per fare un esempio, manca un indice a supporto della query, l’hint e la ri-ottimizzazione non servono a nulla… Anzi…



A presto,

Angelo

Da: Massimiliano Valli [mailto:[login to unmask email]
Inviato: giovedì 17 novembre 2016 16:00
A: [login to unmask email]
Oggetto: [DB2UGITALY] - RE: R: Bind DSNCLINF



Ciao Angelo,



abbiamo seguito il tuo consiglio. Provando a rebindare il DSNCLINF con REOPT(ALWAYS), abbiamo aimè avuto un peggioramento dei consumi di CPU del package e delle singole query del LDAP che a noi premeva ottimizzare.

Cosi, siamo tornati indietro e abbiamo percorso la strada della HINT a livello di statment sql, inserendo una riga nella DSN_USERQUERY_TABLE e eseguendo il comando di BIND QUERY. In quest'ultimo passo abbiamo dei problemi legato al contenuto del campo QUERY_TEXT.

In particolare abbiamo:

DSNT281I -DB1C BIND QUERY FOR QUERYNO = 99999 NOT SUCCESSFUL,
REASON: 3. THE STATEMENT TEXT CONTAINS AN ERROR.

Sicuramente è legato alla fattezza della query inserita, ma non capiamo dove può essere l'errore.

Ti scrivo la query:

SELECT e.DN , e.EID
FROM USTLDAP2.DIR_ENTRY AS e
WHERE e.EID IN (
SELECT S.EID
FROM USTLDAP2.DIR_SEARCH AS S , USTLDAP2.DIR_SEARCH AS S1
WHERE ( S.ATTR_ID = 32
AND S.VALUE IN ( X'41434345535347524F555000' ,
X'414343455353524F4C4500' , X'49424D2D53544154494347524F555000'
, X'47524F55504F464E414D455300' ,
X'47524F55504F46554E495155454E414D455300' ) )
AND S.EID = S1.EID
AND ( ( S1.ATTR_ID = 24
OR S1.ATTR_ID = 47 )
AND S1.VALUE = ?
AND S1.LVALUE = ? ) ) FOR FETCH ONLY WITH CS

Inserendo altre query (più semplici) il bind è andato correttamente.



Ancora grazie per l'aiuto



-----End Original Message-----