{"id":13343,"date":"2020-04-02T11:01:00","date_gmt":"2020-04-02T09:01:00","guid":{"rendered":"https:\/\/orizon.es\/?post_type=expertise&#038;p=13343"},"modified":"2023-10-02T11:03:59","modified_gmt":"2023-10-02T09:03:59","slug":"tecnica-mf-2-sort-avanzando-2-2","status":"publish","type":"expertise","link":"https:\/\/orizon.es\/en\/expertise\/tecnica-mf-2-sort-avanzando-2-2\/","title":{"rendered":"T\u00e9cnica MF 2: Sort Avanzando"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\"><strong>Procesamiento de datos Batch, ahorro de hasta el 90% del tiempo empleado con la utilidad SORT<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>El Uso eficiente de utilidad SORT para cruce de ficheros genera grandes ahorros en el procesamiento batch.<\/strong><\/li>\n\n\n\n<li><strong>Ahorro en el tiempo de ejecuci\u00f3n de un 90% al realizar descargas independientes y cruce de ficheros.<\/strong><\/li>\n<\/ul>\n\n\n\n<p>En este caso de procesamiento batch y, utilizando adecuadamente la utilidad SORT, se ahorr\u00f3 m\u00e1s de un 90% en el tiempo de ejecuci\u00f3n elapsed del proceso, ahorrando tambi\u00e9n en el consumo de CPU, y por tanto su coste, en m\u00e1s de un 50%.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><img decoding=\"async\" src=\"http:\/\/demo.orizon.es\/wp-content\/uploads\/2020\/04\/datos.png\" alt=\"\" width=\"780\" height=\"304\"><\/h4>\n\n\n\n<p>A continuaci\u00f3n, pasamos a detallar las ventajas de la utilidad SORT y un caso pr\u00e1ctico:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>La utilidad SORT<\/strong><\/h4>\n\n\n\n<p>Dentro del procesamiento batch, hay m\u00faltiples utilidades para tratar ficheros. Una de ellas es la utilidad SORT que tiene m\u00faltiples funcionalidades, siendo una de ellas unir los registros de dos ficheros, siempre que exista entre ellos una clave com\u00fan que permita establecer el emparejamiento. El resultado es un producto cartesiano de los registros con la misma clave de uno y otro fichero.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"http:\/\/demo.orizon.es\/wp-content\/uploads\/2020\/04\/cruce.png\" alt=\"\" class=\"wp-image-3663\"\/><\/figure>\n\n\n\n<p>Para posibilitar una reducci\u00f3n dr\u00e1stica en el procesamiento batch y tiempo Elapsed, si el contexto es un cruce de ficheros sin m\u00e1s l\u00f3gica que esta y sin que se d\u00e9 la necesidad de realizar operaciones y c\u00e1lculos complejos, es recomendable realizarlo mediante un paso de SORT a un programa de cruce en Cobol o PL\/I.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Para poder realizar el cruce de ficheros en un JCL se requiere del par\u00e1metro JOINKEYS.<\/strong><\/li>\n<\/ul>\n\n\n\n<p><strong>Par\u00e1metros JOINKEYS<\/strong><\/p>\n\n\n\n<p>Para que el cruce mediante Joinkey se pueda llevar a cabo se requieren los siguientes elementos en la ficha de control:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dos sentencias Joinkeys obligatorias.&nbsp;Cada una de ellas estar\u00e1 asociada a un fichero de entrada (F1 y F2) y permitir\u00e1 definir los campos clave de la operaci\u00f3n \u201cjoin\u201d y ordenar\u00e1 los registros (en caso de que fuera necesario). Tras procesar las dos sentencias Joinkeys es cuando se produce el emparejamiento.<\/li>\n\n\n\n<li>Una sentencia JOIN opcional.&nbsp;Permite especificar, a trav\u00e9s de un par\u00e1metro, los registros que queremos que se escriban en la salida. Tras los Joinkeys los registros ya est\u00e1n emparejados.<\/li>\n\n\n\n<li>Una sentencia REFORMAT opcional.&nbsp;Permite reformatear el registro de salida en la forma deseada. Seleccionando los campos y orden de los mismos de cada fichero que queremos obtener como registro resultado.<\/li>\n\n\n\n<li>Una sentencia SORT, bien SORT FIELDS=COPY o cualquier otro tipo de ordenaci\u00f3n.&nbsp;Es necesario tener en cuenta que cualquier definici\u00f3n de ordenaci\u00f3n se debe referir a las posiciones de los registros reformateados \u2013 en caso de haber usado REFORMAT \u2013 o si estamos trabajando directamente con el resultado del producto cartesiano de los elementos emparejados, sin usar REFORMAT.<\/li>\n<\/ul>\n\n\n\n<p>Por otro lado, si se requiere y previo al cruce, se puede ejecutar diferentes sentencias de control para cada uno de los ficheros de entrada. Para ello, se designan como SORTJNF1 y SORTJNF2, referenci\u00e1ndose as\u00ed a cada uno de los ficheros de entrada.<\/p>\n\n\n\n<p>Las distintas utilidades que se pueden ejecutar son:&nbsp;<strong>INCLUDE, OMIT, INREC y SUM.&nbsp;<\/strong><\/p>\n\n\n\n<p>Este tipo de sentencias pueden ayudar a reducir el coste del JOINKEYS mediante filtrados de los ficheros, siempre y cuando sean posibles.<\/p>\n\n\n\n<p><strong>Tipos de cruce de ficheros JOIN<\/strong><\/p>\n\n\n\n<p>La sentencia JOIN es opcional y se utiliza para especificar qu\u00e9 registros se mandan a salida. Si esta se omite, \u00fanicamente los registros que resulten emparejados podr\u00e1n verse en la salida. Sin embargo, la utilidad ofrece otras posibilidades mediante las siguientes opciones.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>UNPAIRED,F1,F2 o simplemente UNPAIRED:&nbsp;registros emparejados y sin pareja de F1 y F2.<\/li>\n\n\n\n<li>UNPAIRED,F1:&nbsp;registros emparejados y sin pareja de F1.<\/li>\n\n\n\n<li>UNPAIRED,F2:&nbsp;registros emparejados y sin pareja de F2.<\/li>\n\n\n\n<li>UNPAIRED,F1,F2,ONLY o simplemente UNPAIRED,ONLY:&nbsp;registros sin pareja de ambos ficheros.<\/li>\n\n\n\n<li>UNPAIRED,F1,ONLY:&nbsp;registros sin pareja de F1.<\/li>\n\n\n\n<li>UNPAIRED,F2,ONLY:&nbsp;registros sin pareja de F2.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"http:\/\/demo.orizon.es\/wp-content\/uploads\/2020\/04\/graf.png\" alt=\"\" class=\"wp-image-3665\"\/><\/figure>\n\n\n\n<p><strong>Etiquetas SORTED y NOSEQCK<\/strong><\/p>\n\n\n\n<p>Para poder realizar el cruce de ficheros mediante Joinkeys es necesario que los ficheros de entrada est\u00e9n ordenados por los campos clave por los que se quiere cruzar; de forma que en caso de que no se le indique lo contrario, el Joinkeys realiza la ordenaci\u00f3n de forma previa al cruce.<\/p>\n\n\n\n<p>Para indicarle que las entradas ya vienen ordenadas se utiliza la etiqueta SORTED. Junto a \u00e9sta, existe la etiqueta NOSEQCK que evita realizar la comprobaci\u00f3n de que los registros vienen ordenados.<\/p>\n\n\n\n<p>Ambas se codifican en las sentencias Joinkeys en la ficha de control, pudi\u00e9ndose usar en uno u otro fichero de entrada, en ambos o en ninguno.<\/p>\n\n\n\n<p>Es importante saber que, si la etiqueta SORTED va acompa\u00f1ada de NOSEQCK y alguna de las entradas no vienen ordenadas, el paso de cruce terminar\u00e1 sin error, pero los resultados son imprevisibles porque realmente no estaremos haciendo un cruce al no estar ordenados algunos de los ficheros.<\/p>\n\n\n\n<p>En cambio, si la etiqueta SORTED no va acompa\u00f1ada de NOSEQCK y alguna de las entradas no vienen ordenadas, el paso de cruce terminar\u00e1 de forma brusca con error.<\/p>\n\n\n\n<p>En este caso, si se tiene la seguridad de que ambas entradas vienen ordenadas, el uso de las etiquetas SORTED y NOSEQCK mejora de forma muy considerable el paso de cruce, reduciendo hasta un 63% el consumo de CPU y un 61% el elapsed del paso.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><img decoding=\"async\" src=\"http:\/\/demo.orizon.es\/wp-content\/uploads\/2020\/04\/cpu-1024x386-1.png\" alt=\"\" class=\"wp-image-3666\"\/><\/figure>\n\n\n\n<p><strong>Utilidades Joinkey<\/strong><\/p>\n\n\n\n<p>Una casu\u00edstica en la que se recomienda el uso de la utilidad Joinkey, es en el caso de querer recuperar registros de dos tablas distintas de BBDD, uniendo ambas por una serie de campos que no formen parte del \u00edndice cl\u00faster de ambas tablas, o bien, el \u00edndice cl\u00faster posea m\u00e1s campos adem\u00e1s de por los que se est\u00e1 realizando la uni\u00f3n entre ellas. En este caso, al no hacer JOIN por los campos m\u00e1s id\u00f3neos, penaliza el hecho de tener de recorrer la tabla por campos no indexados.<\/p>\n\n\n\n<p>Otro caso susceptible de cruzar mediante Joinkey, es que al cruzar las BBDD, aunque los campos de uni\u00f3n sean en ambos casos los id\u00f3neos, las tablas sean de un volumen muy elevado.<\/p>\n\n\n\n<p>Para estos casos, es recomendable realizar las descargas de las tablas de forma independiente, ordenando por los campos de cruce, y posteriormente realizar el cruce mediante un paso de joinkey utilizando las etiquetas SORTED y NOSEQCK.<\/p>\n\n\n\n<p><strong>Caso pr\u00e1ctico<\/strong><\/p>\n\n\n\n<p>A continuaci\u00f3n, se muestra un ejemplo real de uno de nuestros casos de \u00e9xito utilizando correctamente la etiqueta SORTED. En un proceso que se nos solicit\u00f3 analizar para recomendar mejoras que redujeran el consumo del proceso, se detect\u00f3 que se estaba realizando un cruce entre tablas de una manera poco eficiente, ya que los campos por los que cruzaba formaban el \u00edndice cl\u00faster de una de ellas (de tama\u00f1o medio), mientras que para la otra tabla (con una cantidad de registros elevada) dichos campos eran parte del \u00edndice cl\u00faster.<\/p>\n\n\n\n<p><strong>Descarga realizada<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"http:\/\/demo.orizon.es\/wp-content\/uploads\/2020\/04\/tabla.png\" alt=\"\" class=\"wp-image-3667\"\/><\/figure>\n\n\n\n<p><strong>La TABLA1<\/strong>&nbsp;contiene 127.463.056 registros, siendo estos los campos que forman el \u00edndice cl\u00faster<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"http:\/\/demo.orizon.es\/wp-content\/uploads\/2020\/04\/tabla1-610x171-1.png\" alt=\"\" class=\"wp-image-3668\"\/><\/figure>\n\n\n\n<p><strong>La TABLA2<\/strong>&nbsp;contiene 86.654 registros, siendo estos los campos que forman el \u00edndice cl\u00faster<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"http:\/\/demo.orizon.es\/wp-content\/uploads\/2020\/04\/2-1.png\" alt=\"\" class=\"wp-image-3670\"\/><\/figure>\n\n\n\n<p><strong>Caso pr\u00e1ctico \u2013 Soluci\u00f3n propuesta<\/strong><\/p>\n\n\n\n<p>En este caso se recomend\u00f3 realizar descargas independientes en el proceso, filtrando y ordenando simult\u00e1neamente, para posteriormente realizar un cruce mediante un paso Joinkey usando las etiquetas SORTE<\/p>\n\n\n\n<p>D y NOSEQCK.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><img decoding=\"async\" src=\"http:\/\/demo.orizon.es\/wp-content\/uploads\/2020\/04\/casopractico-768x640-1.png\" alt=\"\" class=\"wp-image-3671\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>AHORRO CPU: -50,3% 187 segundos<\/strong><br><strong>AHORRO ELAPSED: -91,3% 1 hora y 45 minutos<\/strong><\/h3>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","protected":false},"excerpt":{"rendered":"<p>Procesamiento de datos Batch, ahorro de hasta el 90% del tiempo empleado con la utilidad SORT En este caso de procesamiento batch y, utilizando adecuadamente la utilidad SORT, se ahorr\u00f3 m\u00e1s de un 90% en el tiempo de ejecuci\u00f3n elapsed del proceso, ahorrando tambi\u00e9n en el consumo de CPU, y por tanto su coste, en [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":13344,"menu_order":0,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","footnotes":""},"class_list":["post-13343","expertise","type-expertise","status-publish","format-standard","has-post-thumbnail","hentry"],"uagb_featured_image_src":{"full":["https:\/\/orizon.es\/wp-content\/uploads\/2023\/10\/TRANSACCIONES_0.1-1.webp",1024,560,false],"thumbnail":["https:\/\/orizon.es\/wp-content\/uploads\/2023\/10\/TRANSACCIONES_0.1-1-150x150.webp",150,150,true],"medium":["https:\/\/orizon.es\/wp-content\/uploads\/2023\/10\/TRANSACCIONES_0.1-1-300x164.webp",300,164,true],"medium_large":["https:\/\/orizon.es\/wp-content\/uploads\/2023\/10\/TRANSACCIONES_0.1-1-768x420.webp",768,420,true],"large":["https:\/\/orizon.es\/wp-content\/uploads\/2023\/10\/TRANSACCIONES_0.1-1.webp",1024,560,false],"1536x1536":["https:\/\/orizon.es\/wp-content\/uploads\/2023\/10\/TRANSACCIONES_0.1-1.webp",1024,560,false],"2048x2048":["https:\/\/orizon.es\/wp-content\/uploads\/2023\/10\/TRANSACCIONES_0.1-1.webp",1024,560,false]},"uagb_author_info":{"display_name":"david","author_link":"https:\/\/orizon.es\/en\/author\/david\/"},"uagb_comment_info":0,"uagb_excerpt":"Procesamiento de datos Batch, ahorro de hasta el 90% del tiempo empleado con la utilidad SORT En este caso de procesamiento batch y, utilizando adecuadamente la utilidad SORT, se ahorr\u00f3 m\u00e1s de un 90% en el tiempo de ejecuci\u00f3n elapsed del proceso, ahorrando tambi\u00e9n en el consumo de CPU, y por tanto su coste, en&hellip;","_links":{"self":[{"href":"https:\/\/orizon.es\/en\/wp-json\/wp\/v2\/expertise\/13343","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/orizon.es\/en\/wp-json\/wp\/v2\/expertise"}],"about":[{"href":"https:\/\/orizon.es\/en\/wp-json\/wp\/v2\/types\/expertise"}],"author":[{"embeddable":true,"href":"https:\/\/orizon.es\/en\/wp-json\/wp\/v2\/users\/1"}],"version-history":[{"count":0,"href":"https:\/\/orizon.es\/en\/wp-json\/wp\/v2\/expertise\/13343\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/orizon.es\/en\/wp-json\/wp\/v2\/media\/13344"}],"wp:attachment":[{"href":"https:\/\/orizon.es\/en\/wp-json\/wp\/v2\/media?parent=13343"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}