DB2 9.7: Tablas globales temporales creadas

Aprenda cuándo y cómo usar CGTTs

Comprenda las capacidades de las tablas globales temporales creadas (CGTTs), un nuevo recurso en el IBM® DB2® 9.7. Este nuevo tipo de tablas temporales utilizan almacenamiento persistente y facilidad de administración. Este artículo cubre la definición, la sintaxis, las especificaciones, las ventajas y las limitaciones de las tablas globales temporales creadas. También trata sobre cómo son diferentes a las tablas globales temporales declaradas (disponibles en versiones previas del DB2), proporciona una corta discusión técnica sobre dónde y por qué utilizarlas, y describe algunos aspectos de habilitación.

William B. McLaren, Senior Developer, IBM

William B. McLaren photoWilliam McLaren trabaja en el equipo DB2 Open Database Technologies y se especializa en compatibilidad y análisis de migración SQL. William cuenta con más de 15 años de experiencia, incluyendo optimización de alto desempeño OLTP y desarrollo de bases de datos en bases de datos relacionales.



Ming W. Wu, DB2 QA Developer, IBM

Ming W. Wu photoMing Wu trabaja en el grupo DB2 LUW Database Functional Testing. Ming tiene más de 20 años de experiencia en DB2, incluyendo desarrollo OLTP, SAP, optimizador de consultas y optimizador de concurrencia.



24-02-2012

Introducción

Como ya se trató en el Information Center DB2 9.7 para Linux, UNIX y Windows (vea Recursos donde hallará un enlace), las tablas globales temporales creadas son un nuevo tipo de tabla temporal definida por usuario introducida en el DB2 9.7. Antes de este release, la tabla temporal declarada (DGTT) era el único tipo de tabla temporal definida por usuario. La diferencia principal entre una DGTT y una CGTT es que la definición de una CGTT se almacena de forma persistente en el catálogo DB2. Una DGTT es creada y existe únicamente por la duración de una sesión de usuario. A diferencia de las DGTTs, las CGTTs son creadas en una sesión y persisten después de que la sesión ha terminado. La definición se comparte a lo largo de sesiones concurrentes, incluso si el contenido de una tabla temporal permanece privado para cada sesión.

Con ambas, CGTT y DGTT, una sesión de aplicación puede usar una tabla temporal creada para almacenar conjuntos de resultados intermedios, para manipulación o referencias repetidas, sin interferir con las aplicaciones que se están ejecutando de forma concurrente. La definición persistente de la CGTT da como resultado las siguientes diferencias operacionales:

  • Después de que una sesión de aplicación define una tabla creada temporalmente, las sesiones que se ejecutan concurrentemente no necesitan redefinirla.
  • Usted puede referenciar una tabla temporal creada en funciones SQL, accionadores, índices y vistas.

Además, cualquier conexión puede referirse a una tabla creada temporalmente en cualquier momento, sin necesidad de un script de configuración para inicializar la tabla creada temporalmente. Una conexión solo puede acceder a las filas que inserta.

Existen dos motivos principales para la creación de la CGTT. Primero, la CGTT se comporta más como una tabla regular para programadores SQL, pero con el potencial de una ventaja de desempeño. Las tablas CGTT pueden definirse anticipadamente, y los usuarios pueden usarlas de forma bastante similar a tablas regulares. Con datos locales para cada sesión (por lo cual no se requiere bloqueo de filas), y con la opción de no-registro, las CGTT proporcionan una ventaja de desempeño potencial.

La segunda motivación para el ofrecimiento CGTT es para asistir en las traducciones de tablas temporales no DB2 hacia tablas temporales DB2. Esto reduce el costo de tal esfuerzo, haciendo que sea más fácil la migración a DB2.

Otras familias de productos DB2, como DB2 for z/OS® y las tablas temporales creadas con soporte del estándar SQL.

Las siguientes secciones le ayudarán a profundizar su conocimiento sobre las CGTT e incluye una discusión técnica detallada sobre dónde y por qué usarlas; una descripción de su sintaxis y un ejemplo funcional sobre cómo usarlas; y las mejores prácticas sobre cómo migrar de DGTT a CGTT.

Requisitos previos

Este artículo está escrito para desarrolladores de bases de datos DB2 y para administradores de bases de datos DB2. Se requiere un conocimiento básico del DB2 y del scripting.

Requisitos de sistema

DB2 9.7 Workgroup Server Edition for Linux®, UNIX® y Windows®, o DB2 9.7 Enterprise Server Edition for Linux, UNIX y Windows.


Discusión técnica

Esta sección discute los comportamientos de las tablas temporales creadas que se deben tener en cuenta.

Las CGTT tienen una opción que permite que o se efectúen registros. Esto realmente puede ayudar al desempeño, configurando la siguiente opción: not logged on commit delete rows. Not logged es el comportamiento predeterminado. Esto también significa que la confirmación o la retroacción darán como resultado una tabla truncada.

Si el objetivo es registrar todos los cambios, entonces use: logged on commit preserve rows. El enunciado de confirmación restaura los datos de sesión al enunciados de confirmación o retroacción previo. Esta opción debe usarse si usted desea el mismo comportamiento que las tablas regulares.

Las CGTT son mucho más eficientes que las tablas regulares. Como no se requieren bloqueos (todos los datos son locales), las CGTT se desempeñan mejor que las tablas regulares. Si no se especifica ningún registro, el desempeño es incluso mejor. Si usted planifica truncar una tabla, use la opción not logged

Si se crean índices en la tabla CGTT, el compilador de consultas tendrá en cuenta esos índices. Runstat en una sesión particular solo tiene en cuenta los datos locales. Esto da el potencial para diferentes planes de acceso en cada sesión.

A menos que se enuncie en la siguiente lista, la CGTT tiene el mismo soporte que las tablas regulares. No obstante, vale la pena señalar lo siguiente:

  • Las CGTT soportan importación/exportación, aunque no soportan carga.
  • Se permiten otorgamientos y revocaciones.
  • Los índices añadidos en una sesión son visibles para otras sesiones. No obstante, si los datos de sesión están en conflicto con un nuevo índice (como filas duplicadas en conflicto con un índice único), el índice no se materializa para esa sesión sino hasta que los datos se hayan corregido. Es mejor hacer que todos los índices se definan durante la fase de preparación para evitar esas confusiones.
  • Las CGTT no soportan restricciones sobre claves primarias, pero usted puede crear un índice único.
  • Las CGTT no soportan restricciones. Si usted crea una tabla CGTT usando la cláusula LIKE (crear CGTT como una tabla regular), el enunciado será exitoso, pero la CGTT no heredará las restricciones de la tabla original.
  • La compresión de tabla está activada de forma predeterminada (si usted compra la opción). Sin embargo, comprimir datos a los que se accede con frecuencia puede no ser la mejor opción de desempeño. Usted está en capacidad de deshabilitar la compresión de las tablas CGTT.

Usted puede crear accionadores para las CGTT. Las CGTT también pueden usarse en el cuerpo del disparador. El contenido de la CGTT es local para la sesión. Usted debe usar CGTT en lugar de DGTT cuando:

  • Son creadas con frecuencia
  • Se desean índices
  • Usted desea usarlas en una vista

Las CGTT no soportan:

  • enunciados rename, alter, reorg, refresh, nickname, comments, ni lock
  • RI
  • Tabla con tipo, particiones de rango, ni tablas MDC
  • Comenzar la tabla base de una vista materializada
  • Comenzar la tabla base de una vista asegurada
  • Columnas XML

El DB2 cuenta con muchas ventajas sobre la implementación de Oracle. La sintaxis de Oracle funcionará en DB2 y en la mayoría de los casos no se necesitará migración. Con DB2, usted puede:

  • Hacer partición hash de los datos
  • Revertir condiciones (la CGTT permite la flexibilidad para esto)
  • Especifique un espacio de tabla, pero debe ser temporal de usuario
  • Seleccionar si registrar o no

Existen muchos usos diferentes para las CGTT y casos en los que es bueno usarlas. Observemos algunos ejemplos en los que habría sido un buen uso de capacidades CGTT:

  • Un carrito de compras on-line, donde cada usuario on-line tiene una CGTT para su carrito de compras, que es creada y destruida programáticamente para su sesión y copiada a una tabla real cuando compra los productos.
  • Inscripción a clases, donde cada estudiante tiene todas las selecciones del cronograma del curso, y donde cada estudiante tiene su propio balde en la CGTT. En cuanto el estudiante acepta las selecciones, estas se mueven hacia la tabla real de las selecciones de todo el curso.
  • La vinculación a prestaciones de una compañía, donde los empleados están efectuando sus selecciones de beneficios (seguro en salud, dental, pensiones, y demás) para el siguiente año fiscal. En cuanto confirman sus selecciones, se pasan de la CGTT a tablas reales.

Las CGTTs son más fáciles de mantener que las tablas regulares porque las tablas regulares habrían tenido que ser re-organizadas y los cambios de no registro pueden reducir los problemas de contención de registro para aplicaciones que efectúan muchas transacciones. También pueden simplificar la optimización sobre DGTT gracias a que soportan el uso de índices y de opciones de registro.


Cómo usar las CGTT DB2

Los listados de código en esta sección muestran cómo trabajan las CGTTs en DB2. Todos pueden ejecutarse desde APIs y herramientas DB2, incluyendo CLP, CLPPlus, Optim Database Administrator y Optim Development Studio. Los listados pueden ejecutarse en su propia base de datos DB2. Asegúrese de cambiar el dbname del script por el nombre correcto de su base de datos, y luego cree los usuarios user1 y user2 antes de ejecutar la prueba. Esta sección muestra que incluso después de una confirmación, no se puede acceder a los datos desde otra sesión.

El Listado 1 muestra la sintaxis SQL para la creación de la CGTT:

Listado 1. Sintaxis DB2
Create GLOBAL TEMPORARY TABLE <table_name> (
<column_name> <column_datatype>,
<column_name> <column_datatype>,
…  )
ON COMMIT [PRESERVE|DELETE] ROWS
[NOT LOGGED|LOGGED] ON ROLLBACK [PRESERVE|DELETE] ROWS 
DISTRIBUTE BY HASH ( col1,..)
IN <tspace-name>;

El Listado 2 Muestra cómo conectarse a la base de datos, descartar/crear la tabla temporal global, crear alias, otorgar todas las autoridades al público, insertar datos en la tabla y seleccionar un conteo de filas de la tabla.

De nuevo, asegúrese de cambiar el dbname con el nombre de su base de datos y user1 con su nombre en todos los listados.

Listado 2. Conexión a la base de datos y otras acciones
|--------10--------20--------30--------40--------50--------60--------70--------80--------|
CONNECT TO dbname USER user1;

DROP TABLE user1.gtt_test;

CREATE GLOBAL TEMPORARY TABLE user1.gtt_test
   ( col1   number(5),
     Col2   date default sysdate) 
ON COMMIT PRESERVE ROWS
NOT LOGGED ON ROLLBACK DELETE ROWS;

DROP PUBLIC ALIAS gtt_test;

CREATE PUBLIC ALIAS gtt_test FOR user1.gtt_test;

GRANT ALL ON gtt_test TO PUBLIC;

INSERT INTO gtt_test ( col1 ) select rownum from syscat.tables where rownum < 100;

COMMIT;

SELECT COUNT(*) FROM gtt_test;

El Listado 2 crea un alias público para la tabla global temporal creada recientemente, de manera que puede ser referenciada como gtt_test sin tener que calificar el nombre de tabla. También concede el acceso público, inserta datos y luego realiza una selección de la tabla.

Cuando usted ejecuta el Listado 2, deberá ver los mismos resultados del Listado 3. El Listado 3 muestra el resultado del enunciado select. Usted debe ver un conteo de 99 del enunciado select count(*) :

Listado 3. select count(*) results
>db2 -tvf gtt_1.sql 


SELECT COUNT(*) FROM gtt_test

1-----------

         99


  1 record(s) selected.

Si usted ejecuta el código del Listado 4 desde otra sesión, verá que los datos no son compartidos entre diferentes sesiones. En el Listado 4, este se conecta a una base de datos como un usuario diferente y selects count(*) desde la tabla global temporal creada gtt_test. Existe un alias en la tabla, por lo que usted no necesita especificar al propietario de la tabla.

Listado 4. Conectándose a una base de datos como un usuario diferente
|--------10--------20--------30--------40--------50--------60--------70--------80--------|
CONNECT TO dbname USER user2;

SELECT count(*) FROM gtt_test;

Cuando usted ejecuta el Listado 4, deberá ver los mismos resultados que en el Listado 5—un conteo de 0 desde el enunciado select count(*) :

Listado 5. select count(*) results
db2 "select count(*) from db2inst1.gtt_test";

1-----------

          0


  1 record(s) selected.

El Listado 6 debe ejecutarse desde la primara sesión establecida cuando se ejecuta el Listado 2. Este selecciona todos los datos desde la tabla para las dos primeras filas.

Listado 6. Seleccionando datos de las primeras filas de la tabla
|--------10--------20--------30--------40--------50--------60--------70--------80--------|
SELECT * FROM gtt_test where rownum < 5;

Ejecute el Listado 6 desde la sesión user1. Este muestra que los valores predeterminados funcionan en la Tabla Global Temporal Creada y que en cada fila se ingresó la fecha. Sus resultados deben verse como el Listado 7, donde se muestran cuatro filas:

Listado 7. Resultados
$ db2 "SELECT * FROM gtt_test where rownum < 5";

COL1    COL2               

------- -------------------

     1. 2009-07-10-12.34.41

     2. 2009-07-10-12.34.41

     3. 2009-07-10-12.34.41

     4. 2009-07-10-12.34.41


  4 record(s) selected

El siguiente paso es ejecutar el Listado 8, nuevamente desde la sesión user 1. Esto mostrará que truncar una Tabla Global Temporal Creada funciona correctamente.

Listado 8. Truncando una CGTT
|--------10--------20--------30--------40--------50--------60--------70--------80--------|
SELECT COUNT(*) from gtt_test;

TRUNCATE TABLE gtt_test;

SELECT * FROM gtt_test where rownum < 5;

Este código selecciona todo lo de la tabla, la trunca y luego selecciona todo de nuevo para mostrar que ya no están los datos. Verifique que sus resultados sean iguales a los del Listado 9:

Listado 9. Resultados
db2inst1@mclaren-laptop:/home/mclaren/sql$ db2 -tvf gtt_4.sql 

SELECT COUNT(*) from gtt_test

1          
-----------
         99



  1 record(s) selected.



TRUNCATE TABLE gtt_test

DB20000I  The SQL command completed successfully.



SELECT * FROM gtt_test where rownum < 5


COL1    COL2               

------- -------------------

  0 record(s) selected.

Como puede ver los resultados, los datos se truncaron correctamente.


Convierta una tabla global temporal declarada (DGTT) en una tabla global temporal creada (CGTT)

El DB2 soporta DGTTs (tablas globales temporales declaradas) y CGTTs tablas globales temporales creadas). Ambas se utilizan para soportar datos de sesión. Para algunos modelos de programación, convertir DGTT a CGTT puede eliminar la necesidad de declarar tablas temporales al inicio de cada sesión de usuario. Como las CGTT son persistentes, se pueden crear y compartir para todas las sesiones durante la configuración de sistema.

En comparación de CGTT, la DGTT tiene las siguientes limitaciones:

  • La DGTT se declara en una sesión. La definición de tabla es persistente solo para esa sesión.
  • La DGTT no está en el catálogo de sistema. Esto significa que para todos los enunciados referentes a la DGTT, esta se debe compilar antes de su uso. La CGTT esencialmente mueve el proceso de configuración de tabla hacia afuera de la sesión.
  • La DGTT tiene el esquema arreglado SESSION. La CGTT sigue las reglas de esquema de las tablas regulares.

El Listado 9 muestra un ejemplo de una tabla temporal declarada. Usted convertirá esta DGTT en una CGTT en un listado posterior.

Listado 10. Ejemplo de tabla global temporal declarada
declare global temporary table dgttbase1 
           ( B1_c1	integer,
             B1_C2	varchar(20),
	     B1_c3      varchar(20)
           )  on commit preserve rows;
insert into SESSION.dgttbase1 values (1,'R2_c1 is 1', 'inserted row');
insert into SESSION.dgttbase1 values (2,'R2_c1 is 2', 'inserted row');
connect reset;

connect to dbname;
insert into SESSION.dgttbase1 values (3,'R2_c1 is 3', 'inserted row');
select * from SESSION.dgttbase1;
connect reset;

Table SESSION.dgttbase1 no es visible para la segunda sesión. Para usar dgttbase1 en la segunda sesión usted debe recrear la tabla de la sesión de nuevo. El Listado 11 muestra el resultado de los comandos. Al final de la sesión, la DGTT ya no está allí.

Listado 11. Resultado de comando
declare global temporary table dgttbase1 ( B1_c1      integer, 
                                           B1_C2      varchar(20),
                                           B1_c3      varchar(20) 
                                         )  on commit preserve rows
DB20000I  The SQL command completed successfully.

insert into SESSION.dgttbase1 values (1,'R2_c1 is 1', 'inserted row')
DB20000I  The SQL command completed successfully.

insert into SESSION.dgttbase1 values (2,'R2_c1 is 2', 'inserted row')
DB20000I  The SQL command completed successfully.

onnect reset
DB20000I  The SQL command completed successfully.

connect to dbname

insert into SESSION.dgttbase1 values (3,'R2_c1 is 3', 'inserted row')
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0204N  "SESSION.DGTTBASE1" is an undefined name.  SQLSTATE=42704

select * from SESSION.dgttbase1
SQL0204N  "SESSION.DGTTBASE1" is an undefined name.  SQLSTATE=42704

connect reset
DB20000I  The SQL command completed successfully.

El Listado 12 muestra cómo la tabla DGTT puede convertirse en CGTT. La sintaxis para CGTT es bastante similar a la de DGTT. En contraste con la DGTT, durante la segunda sesión la definición de cgttbase1 todavía es válida.

Listado 12. Convirtiendo DGTT a CGTT
Connect to <dbname>
create global temporary table cgttbase1 
           ( B1_c1	integer,
             B1_C2	varchar(20),
             B1_c3      varchar(20)
           )  on commit preserve rows;
connect reset;

insert into cgttbase1 values (1,'R2_c1 is 1', 'inserted row');
insert into cgttbase1 values (2,'R2_c1 is 2', 'inserted row');

Connect reset;
Connect to <dbname>
insert into cgttbase1 values (3,'R2_c1 is 3', 'inserted row');
insert into cgttbase1 values (4,'R2_c1 is 4', 'inserted row');
select * from cgttbase1;
connect reset;

En cuanto la tabla CGTT cgttbase1 es creada, esta es persistente para todas las sesiones que siguen.

Listado 13. Resultado de los enunciados anteriores
Connect to dbname
create global temporary table cgttbase1 ( B1_c1     integer, 
                                          B1_C2     varchar(20), 
                                          B1_c3     varchar(20) 
                                        )  on commit preserve rows
DB20000I  The SQL command completed successfully.
connect reset


connect to dbname
insert into cgttbase1 values (1,'R2_c1 is 1', 'inserted row')
DB20000I  The SQL command completed successfully.

insert into cgttbase1 values (2,'R2_c1 is 2', 'inserted row')
DB20000I  The SQL command completed successfully.
Connect reset

Connect to dbname
insert into cgttbase1 values (3,'R2_c1 is 3', 'inserted row')
DB20000I  The SQL command completed successfully.
insert into cgttbase1 values (4,'R2_c1 is 4', 'inserted row')
DB20000I  The SQL command completed successfully.

select * from cgttbase1

B1_C1       B1_C2                B1_C3               
----------- -------------------- --------------------
          3 R2_c1 is 3           inserted row        
          4 R2_c1 is 4           inserted row        

  2 record(s) selected.
connect reset

Conclusión

Las tablas globales temporales creadas (CGTTs) son un nuevo recurso en DB2 9.7 que proporciona las siguientes nuevas capacidades:

  • Soporte de índice
  • Soporte de disparadores
  • Soporte para uso en vistas
  • Definición persistente
  • Opciones de registro cronológico
  • Opción de partición hash
  • Flexibilidad de retroacción

Las CGTTs proporcionan definición global persistente, permitiendo que todas las sesiones de usuario accedan a la misma definición de tabla sin tener que declararla en la inicialización. Para algunas aplicaciones DB2 existentes, las CGTT pueden reemplazar a las DGTT para simplificar su modelo de programación. Por ejemplo, poder usar las vistas y el soporte de disparador puede hacer que la escritura de una aplicación sea menos compleja al tener estas opciones disponibles. Es más fácil de mantener que bases de datos regulares, porque las CGTT reducen la necesidad de mantenimiento. La optimización pude facilitarse con el soporte de índices de las CGTT. Y, las CGTT, cuando se comparan con tablas regulares y DGTT, ofrecen mayor flexibilidad y desempeño al presentar las nuevas opciones de confirmación de registros.

Las CGTTs también son útiles cuando usted está migrando aplicaciones desde otras bases de datos hacia DB2. Por ejemplo, las tablas temporales Oracle pueden adaptarse fácilmente como CGTT DB2.

Existen muchas ventajas para las CGTTs. Ahora usted debe tener el conocimiento que necesita para usarlas en sus aplicaciones.

Recursos

Aprender

Obtener los productos y tecnologías

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Information mgmt
ArticleID=795371
ArticleTitle=DB2 9.7: Tablas globales temporales creadas
publish-date=02242012