martedì 25 settembre 2007

Ottimizzazione

DB2 Vsam Jcl Ims Cics

24 commenti:

Anonimo ha detto...

Nell'ambito di un flusso batch di repro di un file vsam di grosse dimensioni ,sforiamo con la finestra batch richiesta da cliente.
Senza far intervenire l'applicativo mi sapete consigliare una metodologia per abbassare i tempi di elapsed del batch.
Grazie

Anonimo ha detto...

Puoi impostare i parametri previsti sul jcl per i dataset vsam es
//DBMASX DD DSN=S0812.IMENS.SRD1.SRDMAST,DISP=SHR,
// AMP=('AMORG,BUFND=75,BUFNI=75') , ti consiglio di impostare se hai un dataset sequenziale anche il parametro bufno=200 nella relativa scheda jcl

Anonimo ha detto...

In una query il predicato 'like' nella condizione permette l'utilizzo dell'indice ?

Anonimo ha detto...

dipende :
A esiste un campo indicizzato con la colonna specificata ?
B se il % viene messo come primo carattere il db2 non utilizzerà l'indice.

Anonimo ha detto...

Alcuni giorni fa sono stato contattato da un collega che aveva la necessità di utilizzare sotto il controllo di una transazione Ims un programma in Sql dinamico dove sql veniva generato dinamicamente da un modulo Java, il tutto sotto il controllo di un package db2.
L'applicativo di competenza eseguiva le call in questione su tabelle con owner differenti.Siccome l'owner non era qualificato all'interno della call abbiamo dovuto creare gli alias db2 tentando di validare il tutto tramite l'opzione qualifier nel membro di bind.Faccio presente che gli accessi al db2 sono gestiti tramite racf.
Chiaramente il bind del plan e del package sono stati eseguiti immettendo la clausola dynamicrules bind validati bind per permettere di eseguire il controllo autorizzativo solo all'atto del bind e propagarlo a tutti gli autorizzatori impostando come qualifier del package l'owner principale.
Il db2 in questo caso 'utilizzo degli alias' non si è comportato come ci si aspettava (bypassando il controllo racf-db2 nel momento dell'esecuzione dell'istruzione) ma ha eseguito il controllo fermando l'utente con un bel -551. Per ovviare al tutto abbiamo dovuto rigenerare le tabelle con un owner solo settando il qualifier dell'owner e del qualifier del bind package e plan uguale all'owner di creazione delle tabelle.

Anonimo ha detto...
Questo commento è stato eliminato da un amministratore del blog.
Anonimo ha detto...

Dimanna
Come se fa a nun raddoppia????

Anonimo ha detto...

Invece di eseguireprima laselect addizionare 1 e dopo fare l'update fai subito update set + 1epoi esegui la select

Anonimo ha detto...

In una transazione Ims/db2 una call sql su una tabelladi parecchi milioni di record durapiù di 5 ore.
In particolare la tabella ha 4 indici ed il codice sql che esegue è del tipo
where campo1 between :h and :h
and campo2 between :h and :h
e cosi via per circa una decina di campi . Come posso fare a far decidere in sql statico la migliore strategia di accesso e ridurre i tempi di elapsed ?

Anonimo ha detto...

L'unica cosa che può ottimizzare un linguaggio del genere in presenza di più indici è utilizzare all'atto del bind del package la clausola defer prepare.
In questo modo il db2 valuterà la strategia di accesso ai dati all'atto dell'esecuzione tenendo in considerazione i valori immessi dall'operatore.

Anonimo ha detto...

Stiamo utilizzando tramite una applicazione web sql dinamico , il tutto è lanciato sempre dalla stessa utenza.
Notiamo una certa perdita di tempo causata da una rivalidazione delle strategie di accesso ai dati .
Ma il db2 nel caso di sql dinamico lanciato dalla stessa utenza non doveva tenere traccia in cache delle strategie di accesso ?

Anonimo ha detto...

Devi verificare che in dsnzparm sia attivato il parametro cache dyn .
Probabilmente sul tuo sottositema è impostato a no ed il db2 non può mantenere in cache le strategie.

Anonimo ha detto...

Esiste un metodo per spostare dalla
'fetch' alla 'Open' del cursore l'attività di estrazione dei dati?
Ottenendo quindi maggiori tempi al
momento dell'apertura del cursore, ma ottimizzando i tempi di scansione delle occorrenze rilevate.

Anonimo ha detto...

Stai parlando di una elaborazione batch o di un TP?

Anonimo ha detto...

Allora lacosaè un po complessa:
Se ituoi tempi sono sulla fetch , molte volte la causa è di naturaapplicativa , per esempio se tu hai utilizzato l'opzione optimize for 1 rows all'interno di un cursore e il db2 tira fuori + di una riga ti troverai sotto il monitor dei tempi alti nelle fetch successive.
In realta tu dovevi usare la clausola fetch first 1 row per ottenere il migior risultato.

Anonimo ha detto...

In un attività di tipo batch per velocizzare l'accesso ai dati conviene mettere a livello di bind del package la clausola currentdata no , questo ti permetterà di utilizzare al meglio le funzioni del db2 ed in particolare la sequential detection e la lock avoidance.

Anonimo ha detto...

Per eliminare o contenere i dubbi su tale argomento ho effettuato MVS JOB JOB
JOB SYSTEM START END
NAME CPU_SEC ID TIME TIME
M910256N 1324 SVA1 2007-10-16-15.45.33.540000 2007-10-16-16.37.38.050000 Compress n
M910256Y 1304 SVA1 2007-10-16-15.45.33.620000 2007-10-16-16.22.44.120000 Compress y
una prova sui consumi di cpu di una tabella con lunghezza record di 1079 byte contenente 20574213 record .

Il job M910256N indica i consumi e gli elapsed dello scarico della tabella senza compressione , mentre il job M910256Y indica quelli della tabella compressa.

Si fa presente che i due job sono partiti in parallelo , con la stessa priorità e sulla stessa classe di esecuzione.

si può notare come nonostante il job M910256Y lavori sullo scarico intero della tabella compressa , il consumo di cpu è inferiore di circa 20 secondi mentre l'elapsed time è inferiore di 15 minuti .

inoltre evidenzio la percentuale di spazio utilizzato per oggetto

DDBAS000 SDBAS00N 1 S 2097360 2097152 100
DDBAS000 SDBAS00N 2 S 2097360 2097152 100
DDBAS000 SDBAS00N 3 S 2097360 2097152 100
DDBAS000 SDBAS00N 4 S 2097360 2097152 100
DDBAS000 SDBAS00N 5 S 2097360 2097152 100
DDBAS000 SDBAS00N 6 S 2097360 2097152 100
DDBAS000 SDBAS00N 7 S 2097360 2097152 100
DDBAS000 SDBAS00N 8 S 2097360 2097152 100
DDBAS000 SDBAS00N 9 S 2097360 2097152 100
DDBAS000 SDBAS00N 10 S 2097360 2097152 100
DDBAS000 SDBAS00N 11 S 2097360 2097152 100
DDBAS000 SDBAS00N 12 S 2097360 2097152 100
DDBAS000 SDBAS00N 13 S 2097360 2097152 100
DDBAS000 SDBAS00N 14 S 730080 174300 24
DDBAS000 SDBAS00Y 1 S 2097360 2097152 100
DDBAS000 SDBAS00Y 2 S 2033280 1969952 97

dai dati si evince che il ts compresso occupa una percentuale minima dello spazio del ts non compresso.

totali

ts n ts y % occupata

27437276 4067104 14,82328


Di conseguenza i risparmi saranno su tutte le attività che riguardano gli oggetti .

Image copy,Reorg , batch, comprese le operazioni di disaster recovery a caldo dove il data-transfer sarà commisurato all'ampiezza dell'oggetto.

Controindicazioni .

Per tabelle con un'alta movimentazione online possibile revisione dei parametri del locksize da pagina a riga.

Anonimo ha detto...

Come sapere che giorno è con una query

SELECT CASE (DAYS(&A&WEEK&A)-DAYS(&A&WEEK&A)/7 * 7) + 1


WHEN 1 THEN 'DOM'
WHEN 2 THEN 'LUN'
WHEN 3 THEN 'MAR'
WHEN 4 THEN 'MER'
WHEN 5 THEN 'GIO'
WHEN 6 THEN 'VEN'
WHEN 7 THEN 'SAB'

END GIORNO

FROM SYSIBM.SYSDUMMY1

Anonimo ha detto...

Ma non è meglio questa?



SELECT DAYOFWEEK_ISO('2007-10-23')

FROM SYSIBM.SYSDUMMY1

Ciao

Angelo

Anonimo ha detto...

Hai ragione Angelo mi piace di più ;
C'è sempre da imparare.
In alternativa se si vuole gia decodificato il giorno si può fare un mix delle due

SELECT CASE (DAYOFWEEK('2007-10-24')
WHEN 1 THEN 'DOM'
WHEN 2 THEN 'LUN'
WHEN 3 THEN 'MAR'
WHEN 4 THEN 'MER'
WHEN 5 THEN 'GIO'
WHEN 6 THEN 'VEN'
WHEN 7 THEN 'SAB'
END GIORNO
FROM SYSIBM.SYSDUMMY1

Anonimo ha detto...

Ho altissimi consumi dicpua livello transazionale cics che posso controllare ?

Anonimo ha detto...

Ho altissimi consumi dicpua livello transazionale cics che posso controllare ?

Anonimo ha detto...

Verifica i display eseguiti dai programmi applicativi

Unknown ha detto...

ho due database uno host e uno dipartimentale ed ho la necessita su cics di accedere a tutte e due.
è possibile associare alla stessa transazione due plan uno normale e uno remoto????
grazie
perchè altrimenti facendo le connect e poi la reset avrei una syncpoint automatica
e cioò non mi aggrada molto anche perchè in caso di errore non potrei tornare indietro su quello che ho già confermato

 
Google