Mostrando entradas con la etiqueta SYSINDEXES. Mostrar todas las entradas
Mostrando entradas con la etiqueta SYSINDEXES. Mostrar todas las entradas

lunes, 29 de agosto de 2016

Ficheros Secuenciales vs Ficheros VSAM ¿Cuál es el mejor?

Ficheros Secuenciales

Hoy vamos a tratar el tema, de archivos secuenciales contra VSAM, y para aquellos que son principiantes con el tema, vamos a desmenuzar un poco algo de cada uno de los ficheros con el fin de que a la hora de desarrollar sepan cual es el más óptimo.
Un archivo secuencial es aquel que consta de registros que se almacena y se accede a ellos de modo secuencial (de principio a fin), es decir que si quieres hacer la lectura del registro ocho, tienes que hacer las siete lecturas de los registros, para llegar.
Te recomendaría este tipo de archivo si quisieras que

  •          El tamaño de memoria fuera mínimo
  •          El archivo fuera fácilmente editable
Se pueden enumerar los principales atributos del archivo de organización secuencial


  • Un nuevo registro no se puede insertar ni en medio ni al principio del archivo, este siempre se insertara al final del archivo.
  • Después de especificar el tamaño de un registro en un archivo secuencial, no es posible, reducir o alargar un registro.
  • El orden de  los registros, tal y como se insertan no puede ser cambiado.
  •  Es posible la actualización de un registro, pero esto solamente es posible “a manita” a través de la opción del TSO,  de edición. Se puede también sobrescribir un registro, siempre y cuando la nueva longitud de registro sea la misma.
  • Los archivos secuenciales para la escritura de registros de salida son una buena opción, teniendo en cuenta, que no requieren de más especificaciones que el tamaño del registro sea el tamaño del archivo.


Dentro del programa siempre se podrá especificar la sintaxis de la organización del archivo secuencial:

       FILE-CONTROL                                           
       SELECT ENTRADA ASSIGN TO ENTRADA                
                       ORGANIZATION IS SEQUENTIAL       
                       ACCESS MODE  IS SEQUENTIAL       
                       FILE STATUS IS WS-FS-ENTRADA  


Donde
ENTRADA: Archivo que se va a tomar de entrada, el cual deberá de ser secuencial
ORGANIZATION: Se especifica que su organización es secuencial
ACCESS MODE: El modo de acceso, el cual se especifica que es secuencial
FILE STATUS: El estatus del archivo el cual deberá de comenzar con 00.

Mientras que en el JCL nosotros podemos encontrarlo como se muestra en el ejemplo de a continuación:

//ENTRADA  DD  DSN=MOVDELL.R08.I1OUP10.SORTINYU,
//             DISP=(OLD,KEEP,KEEP)                

ENTRADA: Archivo que se va a mandar a llamar para entrada del proceso.

También vamos a mencionar algunos de los inconvenientes que tienen estos archivos:

  •          A tamaño grande la lectura se ralentiza
  •          El acceso a los archivos es puramente secuencial
Por lo cual dependiendo del tamaño de información que vas a procesar, si esta información aumenta o si es constante, o dependiendo de que tantos reportes o movimiento de información vas a realizar con ella, son puntos que debes de tomar en cuenta para validar si es viable este tipo de archivos.

Ficheros VSAM

Definidos como Virtual Storage Access Method, es un tipo de fichero que trata de mejorar lo que se hace con los ficheros secuenciales  y el cual soporta que se tenga un mayor número de registros, y que estos de igual forma puedan ser procesados en un tiempo más óptimo y con un acceso más eficaz.
Estos archivos se caracterizan por tener una llave (clave) de acceso a cada uno de los registros lo cual permite que se tenga un mejor acceso a los archivos,
En la actualidad existen tipos de ficheros: VSAM, KSDS, RRDS, RRDS, ESDS y LDS. 

Se muestra a continuación una breve explicación de en que consiste cada uno de ellos:


  • Entry Sequenced Data Set (ESDS): Se trata de un fichero VSAM, equivalente al clásico Fichero Secuencial
  • Key Sequenced Data Set (KSDS): Emplea dos subficheros para el tratamiento de los datos. Uno para el almacenamiento de los índices, y otro para la información (Registros de datos) asociada a cada índice.
  • Relative Record Data Set (RRDS): Se trata del VSAM mas eficiente. Se asigna un numero relativo a cada registro, que es el que se usara para recuperar la información. Obviamente, si dicha asignación no se actualiza correctamente cada vez que borramos registros del fichero, entonces iran quedando espacios de memoria sin uso y el acceso será cada vez menos eficiente.
  • Linear Data Set (LDS): Este tipo de fichero se emplea para almacenar los TABLESPACE de las bases de datos DB2.
Puede ser raro que veas un desarrollo hecho en archivos VSAM. Esto debido a que cuando se implementó no se tenían bien especificadas las reglas de las bases de datos relacionales dentro del DB2, pero ahora se ha vuelto una práctica más usual que se utilicen las bases de datos relacionales con los archivos secuenciales. O que en casos muy especiales se utilicen desarrollos con archivos VSAM.

Te mostraremos así mismo algunas de las ventajas/ desventajas que tienen estos archivos.

  •      Estos archivos pueden ser de una longitud fija o variable   
  •     Están organizados en bloques de tamaño fijo llamados intervalos de control (IC) y a su vez en divisiones más grandes llamadas Áreas de Control (AC)
  •     El tamaño de los intervalos se miden en bytes
  •     Las áreas de control se miden en número de pistas o cilindros de disco.

La manipulación de ficheros VSAM (“borrar” y “definir”) se realiza normalmente a través de la utilidad de IDCAMS. Los programas propios pueden acceder a ficheros VSAM mediante sentencias de “data definition” (DD) en los JCL o en las regiones online de CICS.
DB2 está implementado sobre ficheros VSAM usando su estructura de datos. 

Espero que te haya gustado el tema. :D



martes, 14 de diciembre de 2010

SYSTABLES, SYSCOLUMNS y SYSINDEXES

Muchas veces queremos conocer la información relativa a la base de datos de una aplicación o instalación, sobre todo cuando nos enfrentamos con ella por primera vez.

Uno de los métodos más fiables y rápidos es utilizar las tablas donde DB2 guarda dicha información. Estas tablas forman parte del "table space" SYSDBASE.

A continuación mencionamos las más comunes y de mayor utilidad. Los ejemplos los haremos sobre el propio SYSDBASE por ser común en todas las instalaciones, pero dejamos como sugerencia para familiarizarnos con las mismas modificar dichas sentencias a gusto de consumidor.

SYSTABLES

Contiene información de cada tabla, vista o alias de la BD.

Algunos campos relevantes de la tabla son los siguientes:

NAME : nombre de la tabla, vista o alias
CREATOR : esquema de la tabla, vista o alias
TYPE : tipo de objeto (A=alias, T=tabla, V=vista...)
DBNAME : base de datos que contiene el "table space" de la tabla o vista
TSNAME : "table space" que contiene la tabla o vista
COLCOUNT : número de columnas de la tabla o vista
REMARKS : información adicional sobre el objeto

Gracias a esta tabla podríamos realizar una consulta a la BD para obtener información de las tablas que forman parte de una aplicación, las vistas que existen en la instalación... En este caso consultaremos las tablas que forman parte del "table space" SYSDBASE:

SELECT SUBSTR(NAME, 1, 15) AS NAME ,      
       SUBSTR(CREATOR, 1, 10) AS CREATOR ,
       SUBSTR(DBNAME, 1, 10) AS DBNAME ,  
       COLCOUNT ,                         
       REMARKS                            
  FROM SYSIBM.SYSTABLES                   
WHERE  CREATOR = 'SYSIBM'                 
AND    TYPE    = 'T'                      
AND    TSNAME  = 'SYSDBASE';              

El resultado de la consulta son el nombre de las tablas y el número de columnas que las forman:

---------+---------+---------+---------+---------+---------+-----
NAME             CREATOR     DBNAME      COLCOUNT  REMARKS       
---------+---------+---------+---------+---------+---------+-----
SYSFIELDS        SYSIBM      DSNDB06           13                
SYSTABLESPACE    SYSIBM      DSNDB06           41                
SYSTABLES        SYSIBM      DSNDB06           52                
SYSTABLEPART     SYSIBM      DSNDB06           41                
SYSTABAUTH       SYSIBM      DSNDB06           29                
SYSSYNONYMS      SYSIBM      DSNDB06            7                
SYSRELS          SYSIBM      DSNDB06           15                
SYSKEYS          SYSIBM      DSNDB06            7                
SYSINDEXPART     SYSIBM      DSNDB06           35                
SYSINDEXES       SYSIBM      DSNDB06           46                
SYSFOREIGNKEYS   SYSIBM      DSNDB06            7                
SYSCOLUMNS       SYSIBM      DSNDB06           35                
SYSCOLAUTH       SYSIBM      DSNDB06           15                

SYSCOLUMNS

Contiene información de cada columna de cada tabla y vista de la BD.

Algunos campos relevantes de la tabla son los siguientes:

NAME : nombre de columna
TBNAME : nombre de la tabla o vista que contiene la columna
TBCREATOR : esquema de la tabla o vista que contiene la columna
COLTYPE : tipo de la columna (INTEGER, FLOAT, CHAR...)
LENGTH : longitud del atributo de la columna, en caso de un decimal sería la precisión
SCALE : escala de un decimal
NULLS : indica si la columna puede contener valores nulos (Y=si, N=no)
REMARKS : información adicional sobre la columna

En este ejemplo mostraremos la forma de obtener información relativa a todos los campos de la tabla SYSCOLUMNS:

SELECT SUBSTR(TBNAME, 1, 10) AS TBNAME ,
       SUBSTR(NAME, 1, 10) AS NAME ,
       COLTYPE ,
       LENGTH ,
       SCALE ,
       NULLS ,
       REMARKS
  FROM SYSIBM.SYSCOLUMNS
 WHERE TBNAME = 'SYSTABLES';

Como resultado obtenemos todos los campos con sus datos de longitud, comentarios, etc...:

---------+---------+---------+---------+---------+---------+----
TBNAME      NAME        COLTYPE   LENGTH   SCALE  NULLS  REMARKS
---------+---------+---------+---------+---------+---------+----
SYSCOLUMNS  COLCARDF    FLOAT          8       0  N   
SYSCOLUMNS  HIGH2KEY    VARCHAR     2000       0  N   
SYSCOLUMNS  LOW2KEY     VARCHAR     2000       0  N   
SYSCOLUMNS  NAME        VARCHAR      128       0  N   
SYSCOLUMNS  STATSTIME   TIMESTMP      10       0  N   
SYSCOLUMNS  TBCREATOR   VARCHAR      128       0  N   
SYSCOLUMNS  TBNAME      VARCHAR      128       0  N   
SYSCOLUMNS  VERSION     SMALLINT       2       0  N  
SYSCOLUMNS  COLNO       SMALLINT       2       0  N 
SYSCOLUMNS  COLTYPE     CHAR           8       0  N 
SYSCOLUMNS  DEFAULT     CHAR           1       0  N 
SYSCOLUMNS  DEFAULTVAL  VARCHAR     1536       0  N 
SYSCOLUMNS  FOREIGNKEY  CHAR           1       0  N 
SYSCOLUMNS  KEYSEQ      SMALLINT       2       0  N 
SYSCOLUMNS  LENGTH      SMALLINT       2       0  N 
SYSCOLUMNS  NAME        VARCHAR      128       0  N 
SYSCOLUMNS  NULLS       CHAR           1       0  N 
...

SYSINDEXES

Contiene información de cada índice de cada tabla y vista de la BD.

Algunos campos relevantes de la tabla son los siguientes:

NAME : nombre del índice
CREATOR : esquema de la tabla o vista del índice
TBNAME : nombre de la tabla o vista del índice
TBCREATOR : esquema de la tabla o vista del índice
UNIQUERULE : indica si el índice es único (D=se permiten duplicados, U=Es único, P=Único e índice primario...)
CLUSTERING : si ha sido especificado "cluster" para el índice (Y=si, N=no)

En este ejemplo uniremos las tablas SYSINDEXES y SYSKEYS para obtener toda la información que nos interesa, ya que SYSKEYS tiene información de los campos que contienen los índices definidos en SYSINDEXES.

SELECT SUBSTR(TBNAME, 1, 10) AS TBNAME,
       SUBSTR(NAME, 1, 15) AS NAME,
       SUBSTR(COLNAME, 1, 10) AS COLNAME,
       UNIQUERULE ,
       CLUSTERING
  FROM SYSIBM.SYSINDEXES A , SYSIBM.SYSKEYS B
 WHERE A.NAME = B.IXNAME
   AND A.TBNAME = 'SYSTABLES';


El resultado son todos los índices definidos sobre la tabla SYSTABLES y los campos que los forman:

---------+---------+---------+---------+---------+---------+---
TBNAME      NAME             COLNAME     UNIQUERULE  CLUSTERING
---------+---------+---------+---------+---------+---------+---
SYSTABLES   SYSTABLES_IX     CREATOR     D           Y
SYSTABLES   SYSTABLES_IX     NAME        D           Y
SYSTABLES   SYSTABLES_IX     STATSTIME   D           Y
SYSTABLES   SYSTABLES_IX2    DBNAME      D           N
SYSTABLES   SYSTABLES_IX2    STATSTIME   D           N
SYSTABLES   SYSTABLES_IX2    TSNAME      D           N
SYSTABLES   DSNDTX01         CREATOR     P           N
SYSTABLES   DSNDTX01         NAME        P           N
SYSTABLES   DSNDTX02         CREATOR     U           N
SYSTABLES   DSNDTX02         DBID        U           N
SYSTABLES   DSNDTX02         NAME        U           N
SYSTABLES   DSNDTX02         OBID        U           N
SYSTABLES   DSNDTX03         TBCREATOR   D           N
SYSTABLES   DSNDTX03         TBNAME      D           N
...

Una posible aplicación interesante de dichas consultas sería extraer la información de la BD a ficheros para ser importada (tras formateo previo) a herramientas CASE. De esta forma, tendríamos modelos entidad-relación completamente actualizados de forma automática. Lo dejamos como sugerencia de un futuro post.