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.