Dfsort 11.0
Autora: Tania Volkmann Hass
INTRODUÇÃO
O DFSORT é um arranjador de dados de alta velocidade no sistema operacional MVS. Possui três funções básicas: SORT, MERGE E COPY e ainda flexibilidade para:
- pré-selecionar registros (INCLUDE/OMIT)
- editar e reformatar registros(INREC/OUTREC)
- somar campos numéricos (SUM), exceto para função COPY
- overridar defaults da instalação
O DFSORT aceita como INPUT arquivos QSAM e VSAM, registros de tamanho fixo ou variável.
INCLUDE/OMIT
São utilizados para selecionar registros antes de enviar para o SORT/MERGE/COPY.
Exemplo: selecionar de um arquivo todos os registros que possuem na posição 10, com 8 bytes, a seqüência de caracteres “ROS3PROD”.
INCLUDE COND= (10,08, ch, CH,EQ,C'ROS3PROD') ou
OMIT COND = (10,08,CH,NE,C'ROS3PROD')
As declarações INCLUD/OMIT são mutuamente exclusivas. Aceitam seleções compostas e continuação noutra linha. Podem ser utilizados os operadores relacionais AND e OR.
INREC/OUTREC
Utilizamos o INREC para reformatar o registro de INPUT, normalmente para eliminar campos desnecessários, aumentando a performance do SORT. O OUTREC é usado para reformatar o registro através do processo de SORT/MERGE ou COPY. Inserção e brancos e constantes, devem ser feitas preferencialmente no OUTREC.
Exemplo:
INREC FIELDS = (10,3,20,8,33,11,5,1)
O registro de INPUT será reformatado da seguinte forma:
1 a 3 – conteúdo da posição 10 com tamanho 3
4 a 11 – conteúdo da posição 20 com tamanho 8
12 a 22 – conteúdo da posição 5 com tamanho 1
SUM
Esta declaração de controle permite:
- somar campos de registros com chaves iguais.
- eliminar registros com chaves duplas.
Exemplo:
SUM FIELDS = (41,8,ZD,55,3,BI)s
Neste exemplo, ocorrem duas somas:
posição 41 a 48 (decimal zonado) e posição 55 a 57 (binário). Os registros com as quebras de chave são gravados em SORTOUT.
Outros Parâmetros:
FILSZ1000 – DFSORT espera 1000 registros exatamente.
FILSZE10000 – aproximadamente 10000 registros
SIZE – especifica a quantidade total de memória disponível para o DSORT.
Exemplos:
SIZE = MAX – deve ser especificado para SORT, MERGE ou COPY de grandesvolumes de dados.
SIZE = 256 K – pode ser especificado para COPY (pequenos volumes).
SIZE = 512 – pode ser especificado para SORT ou MERGE de pequenos volumes de dados.
SKIPREC = M – salta número de registros antes de iniciar um SORT ou COPY do INPUT.
Exemplo:
SKIPREC = 920
STOPAFT = N – ENCERRA O PROCESSO DE LEITURA (SORT ou COPY), quando for atingido o número especificado.
Exemplo:
STOPAFT = 1000
SUGESTÕES PARA AUMENTAR A PERFORMANCE
Tamanho do bloco
Blocos muito pequenos podem degradar a performance do DFSORT. Procure utilizar blocos adequados para o INPUT e OUTPUT de seu SORT.
Tamanho do Registro
Quanto menor o registro, mais rápido o DFSORT. Procure utilizar as declarações INREC para reduzir o tamanho do registro, permanecendo apenas com os campos essenciais.
Nota: INREC para a função COPY é possível no entanto pode degradar a performance, ao contrário do que ocorre para as funções SORT e MERGE.
Quantidade de Registros
Utilize sempre que possível as declarações INCLUDE/OMIT para reduzir a quantidade de registros. Caso a quantidade de registros seja conhecida, especifique via opção FILSZ . esta opção é especialmente importante se for trabalhar com arquivo de entrada residente em fita (alocação de espaço).
Memória:
Em geral uma quantidade generosa de memória aumenta a performance do DFSORT.
Especifique adequadamente o parâmetro SIZE, que é utilizado para alocar memória para o DFSORT.
Agrupamento de campos de controle.
Na existência de vários campos referenciados por uma operação de SORT/MERGE, que sejam subseqüentes e tenham o mesmo formato, é recomendável que sejam codificados como sendo um único campo.
Implementação do ICEGENER
Usando a facilidade do DFSORTCOPY para copiar arquivos, haverá uma redução significativa de tempo de processador.
Os números a seguir refletem uma estimativa feita com base nos seguintes fatos:
a) Codificação da ICEIEXIT para adequar a quantidade de memória aos DFSORT'S de nossa instalação.
Ganho esperado: cerca de 10% do tempo de processador, especialmente para grandes volumes de registros.
b) Substituição do IEBGENER, que não utiliza cartões de controle, pelo ICEGENER.
Ganho esperado: acima de 70% do tempo do processador.
c)Substituição do UTGETPUT, sem PARM, pelo ICEGENER.
Ganho esperado: acima de 45% do tempo de processador.
----------------------------------------------------
PROGR..................... CPU GASTA ....................CPU ESPERA
Sort Externo.............. 1:30h ................ ..........1:15h
IEBGENER................ 16:00h ..........................4:00h
UTGETPUT................. 1:50H ..........................1:00h
CPU GASTA foi o tempo registrado no SMF para todos os programas executados no mês de março/91.
CPU ESPERADA é o tempo de processador esperado com a aplicação dos itens a,b e c acima.
O SORT Interno também será beneficiado, embora sua medição não seja possível, já que o CPU TIME fica apropriado para o programa chamador.
NOTA: O ICEGENER será implantado de forma transparente ao usuário, que continuará executando o IEBGENER.
Exemplo 1:
Eliminação de chaves duplas.
Este exemplo ilustra a utilização do DFSORT para classificar um arquivo, eliminando os registros duplos constituídos por cliente (posição 4 a 12) e órgão responsável (pos. 13 a 21).
INPUT = Fixo blocado, LRECL = 57,BLKSIZE = 10773
OUTPUT = Fixo blocado, LRECL = 40,BLKSIZE = 3200
Notas:
. SUM FIELDS = NONE – elimina duplos
. Reduzir registros é uma boa medida para aumentar a eficiência do DFSORT, e tal recurso foi utilizado através da cláusula INREC, especificando somente os campos necessários na operação.
. A inserção de caracteres de edição para formatação do registro de saída, foi feita somente depois da classificação, com a cláusula OUTREC, aumentando assim também a performance do DFSORT.
//... JOB
// DFSORT EXECPGM=SORT
//SYSOUS DD SYSOUT =T
//SYSPRINT DD SYSOUT= T
//SORTIN DD DSN=S.ROS.SOR.TESTE1,DISP=SHR
//SORTOUT DD DSN= &&T,DISP=(,PASS)
// UNIT=SYSDA,SPACE = (tTRK,1)
// DCB=(RECFM=FB,LRECL=40,BLKSIZE=3200
//DFSPARM DD*
INREC FIELDS = (04,09,13,09)
SORT FIELDS = (C'CLIENTE', 01, 09,3X,C'ORGAO RESP='10,09)
SUMFIELDS = NONE
//
Exemplo 2
Comparativo UTGETPUT X IEBGENER X ICEGENER
Este exemplo ilustra em comparativo de tempos de execução utilizados pelo UTGETPUT, IEBGENER E ICEGENER, para copiar um arquivo variável blocado com LRECL = 2004, BLKSIZE = 2008, VOLUME = 31 cyl (3380).
DFSORT:
//DFSORT ........EXEC........PGM = SORT, PARM = 'SIZE = 256K'
//SYSPRINT......DD SYSOUT = T
//SYSOUS........DD SYSOUT = T
//SORTIN........DD DSN = S.ROS.CEL.ROSACT.DISP = SHR
//SORTOUT.....DD DSN = &&T4,DISP = ,(PASS),
//..................DCB = )BLKSIZE = 2008,L.RECL = 2004,RECFM = VB),
//.................SPACE = (CYL,(10,10), UNIT = SYSDA
//DFSPARM.. . DD*
...SORT FIELDS = COPY
UTGEPUT:
//UTGETPUT........EXEC PGM = UTGETPUT
//SYSPRINT.... ....DD SYSOUT = T
//ENTRADA... ......DD DSN = S.ROS.CEL.ROSACT,DISP = SRH
//SAIDA..............DD DSN = &&T1,DISP = (,PASS)
.................................................DCB = BLKSIZE = 2008,L.RECL
,//
=2004,RECFM = VB),
//......................SPACE = (CYL,(10,10),UNIT = SYSDA
IEBGENER
//IEBGENER........EXEC PGM = IEBGENER
//SYSPRINT........DD SYSOUT = T
//SYSUT1...........DD DSN = S.ROS.CEL.ROSACT.DISP = SHR
//SYSUT2...........DD DSN = &&T2,DISP = (,PAS),
//.....................DCB = (BLKSIZE = 2008,L.RECL = 2004,RECFM = VB),
//....................SPACE = (CYL,(10,10), UNIT = SYSDA
//SYSUB...........DD DUMMY
RESULTADOS ENCONTRADOS
CONSUMO UTGET IEBGEN ICEGEN
CPU TCB 03.57 04.90 00.78
CPU SRB 01.55 05.71 00.07
TOTAL 05.12 10.61 00.85
Outros exemplos encontram-se à disposição no ROSCOE, na biblioteca EQS
IEBGENER (ICEGENER) X UTGETPUT
Quando utilizá-los?
Recomendamos o uso do IEBGENER (ICEGENER) para os seguintes casos:
1.Registros Pequenos (de 1 a 500 bytes) com as características abaixo:
. Grande quantidade de registros.
. Poucos registros por bloco.
EX.LRECL=80,BLKSIZE=1040 (ACIMA DE 10000 Registros)
LRECL=80,BLKSIZE=1600 (acima de 23000 registros)
Nota: Evidentemente, com uma blocagem mais adequada, não deverá ser utilizado o IEBGENER(ICEGENER) para registros tão pequenos.
2. Registros médios (de 500 a 1000 bytes) com as características abaixo:
. Quantidades não muito pequenas de registros, exceto para blocos muito pequenos.
Ex. LRECL=800,BLKSIZE=10400 (Acima de 2000 registros).
LRECL=800,BLKSIZE=1600 (acima de 800 registros)
3.Registros grandes (acima de 1000 bytes com as características abaixo:
. Quantidade não muito pequenas de registros, exceto para blocos muito pequenos.
Ex. LRECL=1000,BLKSIZE=23000 (acima de 2000 registros)
LRECL=1000,BLKSIZE=11000 (acima DE 1000 registros)
Os casos que não se encaixarem nas regras acima deverão fazer uso do UTGETPUT.
INTRODUÇÃO
O DFSORT é um arranjador de dados de alta velocidade no sistema operacional MVS. Possui três funções básicas: SORT, MERGE E COPY e ainda flexibilidade para:
- pré-selecionar registros (INCLUDE/OMIT)
- editar e reformatar registros(INREC/OUTREC)
- somar campos numéricos (SUM), exceto para função COPY
- overridar defaults da instalação
O DFSORT aceita como INPUT arquivos QSAM e VSAM, registros de tamanho fixo ou variável.
INCLUDE/OMIT
São utilizados para selecionar registros antes de enviar para o SORT/MERGE/COPY.
Exemplo: selecionar de um arquivo todos os registros que possuem na posição 10, com 8 bytes, a seqüência de caracteres “ROS3PROD”.
INCLUDE COND= (10,08, ch, CH,EQ,C'ROS3PROD') ou
OMIT COND = (10,08,CH,NE,C'ROS3PROD')
As declarações INCLUD/OMIT são mutuamente exclusivas. Aceitam seleções compostas e continuação noutra linha. Podem ser utilizados os operadores relacionais AND e OR.
INREC/OUTREC
Utilizamos o INREC para reformatar o registro de INPUT, normalmente para eliminar campos desnecessários, aumentando a performance do SORT. O OUTREC é usado para reformatar o registro através do processo de SORT/MERGE ou COPY. Inserção e brancos e constantes, devem ser feitas preferencialmente no OUTREC.
Exemplo:
INREC FIELDS = (10,3,20,8,33,11,5,1)
O registro de INPUT será reformatado da seguinte forma:
1 a 3 – conteúdo da posição 10 com tamanho 3
4 a 11 – conteúdo da posição 20 com tamanho 8
12 a 22 – conteúdo da posição 5 com tamanho 1
SUM
Esta declaração de controle permite:
- somar campos de registros com chaves iguais.
- eliminar registros com chaves duplas.
Exemplo:
SUM FIELDS = (41,8,ZD,55,3,BI)s
Neste exemplo, ocorrem duas somas:
posição 41 a 48 (decimal zonado) e posição 55 a 57 (binário). Os registros com as quebras de chave são gravados em SORTOUT.
Outros Parâmetros:
FILSZ1000 – DFSORT espera 1000 registros exatamente.
FILSZE10000 – aproximadamente 10000 registros
SIZE – especifica a quantidade total de memória disponível para o DSORT.
Exemplos:
SIZE = MAX – deve ser especificado para SORT, MERGE ou COPY de grandesvolumes de dados.
SIZE = 256 K – pode ser especificado para COPY (pequenos volumes).
SIZE = 512 – pode ser especificado para SORT ou MERGE de pequenos volumes de dados.
SKIPREC = M – salta número de registros antes de iniciar um SORT ou COPY do INPUT.
Exemplo:
SKIPREC = 920
STOPAFT = N – ENCERRA O PROCESSO DE LEITURA (SORT ou COPY), quando for atingido o número especificado.
Exemplo:
STOPAFT = 1000
SUGESTÕES PARA AUMENTAR A PERFORMANCE
Tamanho do bloco
Blocos muito pequenos podem degradar a performance do DFSORT. Procure utilizar blocos adequados para o INPUT e OUTPUT de seu SORT.
Tamanho do Registro
Quanto menor o registro, mais rápido o DFSORT. Procure utilizar as declarações INREC para reduzir o tamanho do registro, permanecendo apenas com os campos essenciais.
Nota: INREC para a função COPY é possível no entanto pode degradar a performance, ao contrário do que ocorre para as funções SORT e MERGE.
Quantidade de Registros
Utilize sempre que possível as declarações INCLUDE/OMIT para reduzir a quantidade de registros. Caso a quantidade de registros seja conhecida, especifique via opção FILSZ . esta opção é especialmente importante se for trabalhar com arquivo de entrada residente em fita (alocação de espaço).
Memória:
Em geral uma quantidade generosa de memória aumenta a performance do DFSORT.
Especifique adequadamente o parâmetro SIZE, que é utilizado para alocar memória para o DFSORT.
Agrupamento de campos de controle.
Na existência de vários campos referenciados por uma operação de SORT/MERGE, que sejam subseqüentes e tenham o mesmo formato, é recomendável que sejam codificados como sendo um único campo.
Implementação do ICEGENER
Usando a facilidade do DFSORTCOPY para copiar arquivos, haverá uma redução significativa de tempo de processador.
Os números a seguir refletem uma estimativa feita com base nos seguintes fatos:
a) Codificação da ICEIEXIT para adequar a quantidade de memória aos DFSORT'S de nossa instalação.
Ganho esperado: cerca de 10% do tempo de processador, especialmente para grandes volumes de registros.
b) Substituição do IEBGENER, que não utiliza cartões de controle, pelo ICEGENER.
Ganho esperado: acima de 70% do tempo do processador.
c)Substituição do UTGETPUT, sem PARM, pelo ICEGENER.
Ganho esperado: acima de 45% do tempo de processador.
----------------------------------------------------
PROGR..................... CPU GASTA ....................CPU ESPERA
Sort Externo.............. 1:30h ................ ..........1:15h
IEBGENER................ 16:00h ..........................4:00h
UTGETPUT................. 1:50H ..........................1:00h
CPU GASTA foi o tempo registrado no SMF para todos os programas executados no mês de março/91.
CPU ESPERADA é o tempo de processador esperado com a aplicação dos itens a,b e c acima.
O SORT Interno também será beneficiado, embora sua medição não seja possível, já que o CPU TIME fica apropriado para o programa chamador.
NOTA: O ICEGENER será implantado de forma transparente ao usuário, que continuará executando o IEBGENER.
Exemplo 1:
Eliminação de chaves duplas.
Este exemplo ilustra a utilização do DFSORT para classificar um arquivo, eliminando os registros duplos constituídos por cliente (posição 4 a 12) e órgão responsável (pos. 13 a 21).
INPUT = Fixo blocado, LRECL = 57,BLKSIZE = 10773
OUTPUT = Fixo blocado, LRECL = 40,BLKSIZE = 3200
Notas:
. SUM FIELDS = NONE – elimina duplos
. Reduzir registros é uma boa medida para aumentar a eficiência do DFSORT, e tal recurso foi utilizado através da cláusula INREC, especificando somente os campos necessários na operação.
. A inserção de caracteres de edição para formatação do registro de saída, foi feita somente depois da classificação, com a cláusula OUTREC, aumentando assim também a performance do DFSORT.
//... JOB
// DFSORT EXECPGM=SORT
//SYSOUS DD SYSOUT =T
//SYSPRINT DD SYSOUT= T
//SORTIN DD DSN=S.ROS.SOR.TESTE1,DISP=SHR
//SORTOUT DD DSN= &&T,DISP=(,PASS)
// UNIT=SYSDA,SPACE = (tTRK,1)
// DCB=(RECFM=FB,LRECL=40,BLKSIZE=3200
//DFSPARM DD*
INREC FIELDS = (04,09,13,09)
SORT FIELDS = (C'CLIENTE', 01, 09,3X,C'ORGAO RESP='10,09)
SUMFIELDS = NONE
//
Exemplo 2
Comparativo UTGETPUT X IEBGENER X ICEGENER
Este exemplo ilustra em comparativo de tempos de execução utilizados pelo UTGETPUT, IEBGENER E ICEGENER, para copiar um arquivo variável blocado com LRECL = 2004, BLKSIZE = 2008, VOLUME = 31 cyl (3380).
DFSORT:
//DFSORT ........EXEC........PGM = SORT, PARM = 'SIZE = 256K'
//SYSPRINT......DD SYSOUT = T
//SYSOUS........DD SYSOUT = T
//SORTIN........DD DSN = S.ROS.CEL.ROSACT.DISP = SHR
//SORTOUT.....DD DSN = &&T4,DISP = ,(PASS),
//..................DCB = )BLKSIZE = 2008,L.RECL = 2004,RECFM = VB),
//.................SPACE = (CYL,(10,10), UNIT = SYSDA
//DFSPARM.. . DD*
...SORT FIELDS = COPY
UTGEPUT:
//UTGETPUT........EXEC PGM = UTGETPUT
//SYSPRINT.... ....DD SYSOUT = T
//ENTRADA... ......DD DSN = S.ROS.CEL.ROSACT,DISP = SRH
//SAIDA..............DD DSN = &&T1,DISP = (,PASS)
.................................................DCB = BLKSIZE = 2008,L.RECL
,//
=2004,RECFM = VB),
//......................SPACE = (CYL,(10,10),UNIT = SYSDA
IEBGENER
//IEBGENER........EXEC PGM = IEBGENER
//SYSPRINT........DD SYSOUT = T
//SYSUT1...........DD DSN = S.ROS.CEL.ROSACT.DISP = SHR
//SYSUT2...........DD DSN = &&T2,DISP = (,PAS),
//.....................DCB = (BLKSIZE = 2008,L.RECL = 2004,RECFM = VB),
//....................SPACE = (CYL,(10,10), UNIT = SYSDA
//SYSUB...........DD DUMMY
RESULTADOS ENCONTRADOS
CONSUMO UTGET IEBGEN ICEGEN
CPU TCB 03.57 04.90 00.78
CPU SRB 01.55 05.71 00.07
TOTAL 05.12 10.61 00.85
Outros exemplos encontram-se à disposição no ROSCOE, na biblioteca EQS
IEBGENER (ICEGENER) X UTGETPUT
Quando utilizá-los?
Recomendamos o uso do IEBGENER (ICEGENER) para os seguintes casos:
1.Registros Pequenos (de 1 a 500 bytes) com as características abaixo:
. Grande quantidade de registros.
. Poucos registros por bloco.
EX.LRECL=80,BLKSIZE=1040 (ACIMA DE 10000 Registros)
LRECL=80,BLKSIZE=1600 (acima de 23000 registros)
Nota: Evidentemente, com uma blocagem mais adequada, não deverá ser utilizado o IEBGENER(ICEGENER) para registros tão pequenos.
2. Registros médios (de 500 a 1000 bytes) com as características abaixo:
. Quantidades não muito pequenas de registros, exceto para blocos muito pequenos.
Ex. LRECL=800,BLKSIZE=10400 (Acima de 2000 registros).
LRECL=800,BLKSIZE=1600 (acima de 800 registros)
3.Registros grandes (acima de 1000 bytes com as características abaixo:
. Quantidade não muito pequenas de registros, exceto para blocos muito pequenos.
Ex. LRECL=1000,BLKSIZE=23000 (acima de 2000 registros)
LRECL=1000,BLKSIZE=11000 (acima DE 1000 registros)
Os casos que não se encaixarem nas regras acima deverão fazer uso do UTGETPUT.