Teradata Architects Summit 2012 Dublin

27 enero de 2012

Esta semana la he pasado en tierras de Danny O’Connell en la ‘Teradata Architects Summit 2012′. Allí me he puesto al día de las últimas tendencias, lo que vendrá con Teradata 14.0 y Teradata 14.10, técnicas, herramientas etc…

Architects Summit 2012 (1)

Además pudimos conversar con los verdaderos gurus de Teradata y preguntarles acerca de tecnología (que es lo que nos gusta ¿no?)

Architects Summit 2012 (2)

Architects Summit 2012 (2)

Aunque no todo fueron conferencias. También hubo tiempo para pasear un poco por Dublín:

Architects Summit 2012 (3)

Y, por supuesto, siempre había un ratillo para una Guinness (o dos, o tres, o…).

Saludos.

Carlos.


Tenía que pasar tarde o temprano…

3 enero de 2012


De jirafas y aviones…

3 enero de 2012

Mi amiga A. me envía esta increíble foto desde Sudáfrica:

Jirafa

 

O el avión volaba muy bajo o la jirafa tenía un cuello muuuuy largo…

Saludos.

Carlos.


Happy 0x07DC

31 diciembre de 2011

(En hexadecimal queda muy ‘techie’ y mola más…)

Feliz 2012 a todos los que leen esto, ya sea habitual u ocasionalmente.

Carlos.


¿Cuándo recopilaste estadísticas por última vez (en Teradata) (2)?

21 diciembre de 2011

En capítulos anteriores vimos cómo interpretar los datos de fecha y hora de la última recopilación de estadísticas para una tabla basándonos en la columna ‘fieldstatistics’ de la tabla dbc.tvfields. El caso es que en dicha tabla dbc.tvfields se almacenan los datos de las estadísticas recopìladas PARA COLUMNAS DE UNA EN UNA.

Pero Teradata permite calcular estadísticas para grupos de columnas (sean éstas índices o no). Esto lo podemos ver si ejecutamos un HELP STATISTICS:

 BTEQ -- Enter your SQL request or BTEQ command:
HELP STATISTICS MY_DB.PRUEBA02;

 *** Help information returned. 2 rows.
 *** Total elapsed time was 1 second.

Date     Time     Unique Values        Column Names
-------- -------- -------------------- ------------------------
11/12/21 18:40:17                    3 ID_N2
11/12/21 19:38:02                    4 ID_N2,C_TXT2,D_DATE2

Y aquí viene lo bueno, porque las estadísticas multi-columnas no se guardan en nuestra conocida dbc.tvfields, sino en dbc.Indexes, donde también existe la famosa columna VARBYTE(16383), sólo que en este caso se llama IndexStatistics. Hay que decir que las vistas DBC.IndexStats y DBC.MultiColumnStats toman sus datos de ella. Y también es importante saber que los datos de las estadísticas se guardan únicamente en la columna IndexStatistics DE LA PRIMERA COLUMNA del grupo:

SELECT DatabaseName,
       TableName,
       StatisticsId,
       ColumnName,
       ColumnPosition,
       ColumnsStatistics
  FROM DBC.MultiColumnStats
 WHERE databasename = 'MY_DB'
   AND TableName='PRUEBA02'
 ORDER BY ColumnPosition;

 *** Query completed. 3 rows found. 5 columns returned.
 *** Total elapsed time was 1 second.

DatabaseName TableName StatisticsId ColumnName ColumnPosition  ColumnsStatistics
------------ --------- ------------ ---------- --------------  ----------------------
MY_DB        PRUEBA02           129 ID_N2                   1  DB070C15132602310300...
MY_DB        PRUEBA02           129 C_TXT2                  2  (null)
MY_DB        PRUEBA02           129 D_DATE2                 3  (null)

Muy importante es StatisticsId, ya que indica que las columnas pertenecen a un mismo grupo sobre el que se han recopilado las estadísticas (129). Si recopilamos para otro grupo:

 BTEQ -- Enter your SQL request or BTEQ command:
COLLECT STATISTICS ON MY_DB.PRUEBA02 COLUMN(C_TXT2,D_DATE2);

 *** Update completed. One row changed.
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT DatabaseName,
       TableName,
       StatisticsId,
       ColumnName,
       ColumnPosition,
       ColumnsStatistics
  FROM DBC.MultiColumnStats
 WHERE databasename = 'MY_DB'
   AND TableName='PRUEBA02'
 ORDER BY StatisticsId, ColumnPosition;

 *** Query completed. 5 rows found. 6 columns returned.
 *** Total elapsed time was 1 second.

DatabaseName TableName StatisticsId ColumnName ColumnPosition  ColumnsStatistics
------------ --------- ------------ ---------- --------------  --------------------
MY_DB        PRUEBA02           129 ID_N2                   1  DB070C15132602310300...
MY_DB        PRUEBA02           129 C_TXT2                  2  (null)
MY_DB        PRUEBA02           129 D_DATE2                 3  (null)
MY_DB        PRUEBA02           130 C_TXT2                  1  DB070C15142314510300...
MY_DB        PRUEBA02           130 D_DATE2                 2  (null)

vemos que StatisticsId identifica las columnas que lo componen.

Pues con todo esto podemos hacer:

--
-- LAST_MULTISTATS. View that shows the DatabaseName, TableName, ColumnName, ColumnGroup, Date & Time
--                  of the last COLLECT STATS executed over a group of columns.
--
-- Author: Carlos Álvarez.
--
REPLACE VIEW MY_DB.LAST_MULTISTATS
AS
SELECT DatabaseName,
       TableName   ,
       ColumnName  ,
       ColumnGroup ,
       CAST(TRIM("AÑO") || '-' ||
            TRIM("MES") || '-' ||
            TRIM("DÍA") AS DATE) Fecha,
       CAST(TRIM("HORA")   || ':' ||
            TRIM("MINUTO") || ':' ||
            TRIM("SEGUNDO") AS TIME(0)) Hora
 FROM (
        SELECT
           c.databasenamei (VARCHAR(30)) "DatabaseName",
           b.tvmnamei      (VARCHAR(30)) "TableName",
           d.fieldname     (VARCHAR(30)) "ColumnName",
           a.IndexNumber                 "ColumnGroup",
           HASHBUCKET( CAST(SUBSTR(a.IndexStatistics,2,1) ||
                            SUBSTR(a.IndexStatistics,1,1) ||
                            '0000'XB AS BYTE(4)) ) (FORMAT '9999') "AÑO",
           HASHBUCKET( CAST('00'XB ||
                            SUBSTR(a.IndexStatistics,3,1) ||
                            '0000'XB AS BYTE(4)) ) (FORMAT '99') "MES",
           HASHBUCKET( CAST('00'XB ||
                            SUBSTR(a.IndexStatistics,4,1) ||
                            '0000'XB AS BYTE(4)) ) (FORMAT '99') "DÍA",
           HASHBUCKET( CAST('00'XB ||
                            SUBSTR(a.IndexStatistics,5,1) ||
                            '0000'XB AS BYTE(4)) ) (FORMAT '99') "HORA",
           HASHBUCKET( CAST('00'XB ||
                            SUBSTR(a.IndexStatistics,6,1) ||
                            '0000'XB AS BYTE(4)) ) (FORMAT '99') "MINUTO",
           HASHBUCKET( CAST('00'XB ||
                            SUBSTR(a.IndexStatistics,7,1) ||
                            '0000'XB AS BYTE(4)) ) (FORMAT '99') "SEGUNDO"
      FROM
          dbc.Indexes a,
          dbc.Indexes aa,
          dbc.tvm b,
          dbc.dbase c,
          dbc.tvfields d
    WHERE a.tableid = aa.tableid
      AND a.IndexNumber = aa.IndexNumber
      AND a.tableid = b.tvmid
      AND b.tablekind = 'T'
      AND b.databaseid = c.databaseid
      AND a.IndexStatistics IS NOT NULL
      AND b.TVMid = d.tableid
      AND aa.fieldid = d.fieldid
      ) PRE
;

Y entonces:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT *
  FROM MY_DB.LAST_MULTISTATS
 WHERE TABLENAME='PRUEBA02';

 *** Query completed. 5 rows found. 6 columns returned.
 *** Total elapsed time was 1 second.

DatabaseName TableName ColumnName ColumnGroup       Fecha      Hora
------------ --------- ---------- -----------  ----------  --------
MY_DB        PRUEBA02  C_TXT2             129  2011-12-21  19:38:02
MY_DB        PRUEBA02  D_DATE2            129  2011-12-21  19:38:02
MY_DB        PRUEBA02  ID_N2              129  2011-12-21  19:38:02
MY_DB        PRUEBA02  C_TXT2             130  2011-12-21  20:35:20
MY_DB        PRUEBA02  D_DATE2            130  2011-12-21  20:35:20

y combinarlo con la vista que creamos aquí (con un simple ‘UNION ALL’, por ejemplo) es un juego de niños.

Saludos.

Carlos.


¿Cuándo recopilaste estadísticas por última vez (en Teradata)?

20 diciembre de 2011

En Teradata las estadísticas -como en cualquier otra base de datos, o incluso más- son fundamentales para el rendimiento, ya que el optimizador vive de ellas para poder generar ‘query plans’ que sean eso: óptimos. Además, aquí no hay ‘hints’ ni ‘tweaks’ que hagan que el optimizador pueda pasarse sin ellas para desarrollar su tarea correctamente.

Quizá la forma más fácil de ver cuándo se recopilaron las estadísticas de una tabla por última vez sea ejecutando el comando HELP STATISTICS (o HELP STATS):

 BTEQ -- Enter your SQL request or BTEQ command:
HELP STATISTICS MY_DB.PRUEBA01;

 *** Help information returned. 2 rows.
 *** Total elapsed time was 1 second.

Date     Time     Unique Values Column Names
-------- -------- ------------- ------------
11/12/20 18:53:00             4 ID_N1
11/12/20 18:53:13             4 C_TXT1

También se puede utilizar el ‘Teradata Statistics Wizard‘, que es una utilidad cliente que hace eso y mucho más…

Pero si por cualquier motivo no se quiere o no se puede utilizar ninguno de estos dos métodos Teradata recomienda una feísima ‘query‘ (SQL Data Definition Language – Detailed Topics. Chapter 1. pág 109: COLLECT STATISTICS (Optimizer Form) ) que además está mal:

SELECT c.databasenamei AS DatabaseName,
b.tvmnamei AS TableName,
a.fieldname AS ColumnName,
CAST((CASE WHEN SUBSTR(fieldstatistics,1,1) = ’07′XB
THEN ’2007-’
WHEN SUBSTR(fieldstatistics,1,1) = ’06′XB
THEN ’2006-’
WHEN SUBSTR(fieldstatistics,1,1) = ’05′XB
THEN ’2005-’
WHEN SUBSTR(fieldstatistics,1,1) = ’04′XB
THEN ’2004-’
WHEN SUBSTR(fieldstatistics,1,1) = ’03′XB
THEN ’2003-’
ELSE NULL
END)|| …

Y está mal porque:
·Utiliza un CASE con valores erróneos (debería ser ‘D7′XB, ‘D6′XB, ‘D5′XB…)
·Los valores del CASE están metidos ‘a mano’ (‘hard-coded’) y sin ninguna explicación acerca del porqué.
·Es una solución parcial: sólo funciona desde 2003 a 2007 (¡Hey! ¡Estamos en 2011! ¿no?).

Vamos a investigar un poco más a ver si podemos dar con una mejor solución para saber cuándo fue la última vez que recopilamos estadísticas para nuestra tabla PRUEBA01…

Para empezar, hay que decir que las estadísticas se guardan en una columna llamada ‘fieldstatistics’ de la tabla DBC.TVFIELDS. Además el tipo de la columna es un VARBYTE(16383). Es decir, Teradata guarda la información de las estadísticas de una columna en un formato un tanto ‘particular’.

Si miramos un poco más de cerca el contenido de ‘fieldstatistics’:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT
   c.databasenamei (VARCHAR(30)) "DatabaseName",
   b.tvmnamei      (VARCHAR(30)) "TableName",
   a.fieldname     (VARCHAR(30)) "ColumnName",
   a.fieldstatistics
  FROM
   dbc.tvfields a,
   dbc.tvm b,
   dbc.dbase c
 WHERE a.tableid = b.tvmid
   AND b.tablekind = 'T'
   AND b.databaseid = c.databaseid
   AND UPPER(TRIM(c.databasenamei)) = ('MY_DB')
   AND UPPER(TRIM(b.tvmnamei)) = ('PRUEBA01')
;

 *** Query completed. 2 rows found. 4 columns returned.
 *** Total elapsed time was 1 second.

DatabaseName TableName ColumnName FieldStatistics
------------ --------- ---------- --------------------
MY_DB        PRUEBA01  ID_N1      DB070C141235002C0300...
MY_DB        PRUEBA01  C_TXT1     DB070C1412350D140300...

…vemos que la primera parte su contenido corresponde (un poco) con lo que la ‘query’ de la documentación de Teradata decía. Pero si nos fijamos más en detalle vemos que los dos primeros bytes son la representación hexadecimal del año (con los bytes cambiados de orden):

DB07 -> 0x07DB = 2011

y los siguientes bytes:

0x0C = 12
0×14 = 20
0×12 = 18
0×35 = 53
0×00 = 00

Y claro, comprendemos que corresponden a mes, día, hora, minuto, segundo… (con los mismos valores que salían en el ‘HELP STATS’).

Ahora ya lo vamos viendo claro. Sólamente con conocer como funciona SUBSTR() con datos tipo ‘BYTE’ y cómo convertir estos datos a ‘INTEGERs’ podemos hacer la magia:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT
   c.databasenamei (VARCHAR(30)) "DatabaseName",
   b.tvmnamei      (VARCHAR(30)) "TableName",
   a.fieldname     (VARCHAR(30)) "ColumnName",
   HASHBUCKET( CAST(SUBSTR(a.fieldstatistics,2,1) ||
                    SUBSTR(a.fieldstatistics,1,1) ||
                    '0000'XB AS BYTE(4)) ) (FORMAT '9999') "AÑO",
   HASHBUCKET( CAST('00'XB ||
                    SUBSTR(a.fieldstatistics,3,1) ||
                    '0000'XB AS BYTE(4)) ) (FORMAT '99') "MES",
   HASHBUCKET( CAST('00'XB ||
                    SUBSTR(a.fieldstatistics,4,1) ||
                    '0000'XB AS BYTE(4)) ) (FORMAT '99') "DÍA",
   HASHBUCKET( CAST('00'XB ||
                    SUBSTR(a.fieldstatistics,5,1) ||
                    '0000'XB AS BYTE(4)) ) (FORMAT '99') "HORA",
   HASHBUCKET( CAST('00'XB ||
                    SUBSTR(a.fieldstatistics,6,1) ||
                    '0000'XB AS BYTE(4)) ) (FORMAT '99') "MINUTO",
   HASHBUCKET( CAST('00'XB ||
                    SUBSTR(a.fieldstatistics,7,1) ||
                    '0000'XB AS BYTE(4)) ) (FORMAT '99') "SEGUNDO"
  FROM
   dbc.tvfields a,
   dbc.tvm b,
   dbc.dbase c
 WHERE a.tableid = b.tvmid
   AND b.tablekind = 'T'
   AND b.databaseid = c.databaseid
   AND UPPER(TRIM(c.databasenamei)) = ('MY_DB')
   AND UPPER(TRIM(b.tvmnamei)) = ('PRUEBA01')
   AND a.fieldstatistics IS NOT NULL
;

 *** Query completed. 2 rows found. 9 columns returned.
 *** Total elapsed time was 1 second.

DatabaseName TableName ColumnName  AÑO MES DÍA HORA MINUTO SEGUNDO
------------ --------- ---------- ---- --- --- ---- ------ -------
MY_DB        PRUEBA01  ID_N1      2011  12  20   18     53      00
MY_DB        PRUEBA01  C_TXT1     2011  12  20   18     53      13

Y esta ‘SELECT’ si que es ‘universal’. Sin CASE’s, valores ‘hard-coded’ ni nada de eso.

A partir de aquí, el infinito es el límite:

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT TRIM(DatabaseName) || '.' ||
       TRIM(TableName) || '.' ||
       TRIM(ColumnName)(VARCHAR(64)) "COLUMNA",
       TRIM("AÑO")    || '/' ||
       TRIM("MES")    || '/' ||
       TRIM("DÍA")    || ' ' ||
       TRIM("HORA")   || ':' ||
       TRIM("MINUTO") || ':' ||
       TRIM("SEGUNDO")   "FECHA"
  FROM (
         SELECT
            c.databasenamei (VARCHAR(30)) "DatabaseName",
            b.tvmnamei      (VARCHAR(30)) "TableName",
            a.fieldname     (VARCHAR(30)) "ColumnName",
            HASHBUCKET( CAST(SUBSTR(a.fieldstatistics,2,1) ||
                             SUBSTR(a.fieldstatistics,1,1) ||
                             '0000'XB AS BYTE(4)) ) (FORMAT '9999') "AÑO",
            HASHBUCKET( CAST('00'XB ||
                             SUBSTR(a.fieldstatistics,3,1) ||
                             '0000'XB AS BYTE(4)) ) (FORMAT '99') "MES",
            HASHBUCKET( CAST('00'XB ||
                             SUBSTR(a.fieldstatistics,4,1) ||
                             '0000'XB AS BYTE(4)) ) (FORMAT '99') "DÍA",
            HASHBUCKET( CAST('00'XB ||
                             SUBSTR(a.fieldstatistics,5,1) ||
                             '0000'XB AS BYTE(4)) ) (FORMAT '99') "HORA",
            HASHBUCKET( CAST('00'XB ||
                             SUBSTR(a.fieldstatistics,6,1) ||
                             '0000'XB AS BYTE(4)) ) (FORMAT '99') "MINUTO",
            HASHBUCKET( CAST('00'XB ||
                             SUBSTR(a.fieldstatistics,7,1) ||
                             '0000'XB AS BYTE(4)) ) (FORMAT '99') "SEGUNDO"
           FROM
            dbc.tvfields a,
            dbc.tvm b,
            dbc.dbase c
          WHERE a.tableid = b.tvmid
            AND b.tablekind = 'T'
            AND b.databaseid = c.databaseid
            AND UPPER(TRIM(c.databasenamei)) = ('MY_DB')
            AND UPPER(TRIM(b.tvmnamei)) = ('PRUEBA01')
            AND a.fieldstatistics IS NOT NULL
       ) PRE
ORDER BY 1,2
;

 *** Query completed. 2 rows found. 2 columns returned.
 *** Total elapsed time was 1 second.

COLUMNA                    FECHA
-------------------------- -------------------
MY_DB.PRUEBA01.C_TXT1      2011/12/20 18:53:13
MY_DB.PRUEBA01.ID_N1       2011/12/20 18:53:00

Y la creación de vistas, macros y demás utilidades basados en lo que hemos visto aquí será ya un juego de niños:

--
-- LAST_STATS. View that shows the DatabaseName, TableName, ColumnName, Date & Time of the
--             last COLLECT STATS executed.
--
-- Author: Carlos Álvarez.
--
REPLACE VIEW MY_DB.LAST_STATS
AS
SELECT DatabaseName,
       TableName   ,
       ColumnName  ,
       CAST(TRIM("AÑO") || '-' ||
            TRIM("MES") || '-' ||
            TRIM("DÍA") AS DATE) Fecha,
       CAST(TRIM("HORA")   || ':' ||
            TRIM("MINUTO") || ':' ||
            TRIM("SEGUNDO") AS TIME(0)) Hora
  FROM (
         SELECT
                c.databasenamei (VARCHAR(30)) "DatabaseName",
                b.tvmnamei      (VARCHAR(30)) "TableName",
                a.fieldname     (VARCHAR(30)) "ColumnName",
                HASHBUCKET( CAST(SUBSTR(a.fieldstatistics,2,1) ||
                                 SUBSTR(a.fieldstatistics,1,1) ||
                                 '0000'XB AS BYTE(4)) ) (FORMAT '9999') "AÑO",
                HASHBUCKET( CAST('00'XB ||
                                 SUBSTR(a.fieldstatistics,3,1) ||
                                 '0000'XB AS BYTE(4)) ) (FORMAT '99') "MES",
                HASHBUCKET( CAST('00'XB ||
                                 SUBSTR(a.fieldstatistics,4,1) ||
                                 '0000'XB AS BYTE(4)) ) (FORMAT '99') "DÍA",
                HASHBUCKET( CAST('00'XB ||
                                 SUBSTR(a.fieldstatistics,5,1) ||
                                 '0000'XB AS BYTE(4)) ) (FORMAT '99') "HORA",
                HASHBUCKET( CAST('00'XB ||
                                 SUBSTR(a.fieldstatistics,6,1) ||
                                 '0000'XB AS BYTE(4)) ) (FORMAT '99') "MINUTO",
                HASHBUCKET( CAST('00'XB ||
                                 SUBSTR(a.fieldstatistics,7,1) ||
                                 '0000'XB AS BYTE(4)) ) (FORMAT '99') "SEGUNDO"
           FROM
              dbc.tvfields a,
              dbc.tvm b,
              dbc.dbase c
          WHERE a.tableid = b.tvmid
            AND b.tablekind = 'T'
            AND b.databaseid = c.databaseid
            AND a.fieldstatistics IS NOT NULL
      ) PRE
;

y así:

BTEQ -- Enter your SQL request or BTEQ command:
SELECT * FROM MY_DB.LAST_STATS WHERE TABLENAME='PRUEBA01';

*** Query completed. 2 rows found. 5 columns returned.
*** Total elapsed time was 1 second.

DatabaseName TableName ColumnName Fecha      Hora
------------ --------- ---------- ---------- --------
MY_DB        PRUEBA01  ID_N1      2011-12-20 18:53:00
MY_DB        PRUEBA01  C_TXT1     2011-12-20 18:53:13

Por supuesto, podríamos seguir escarbando en el contenido de ‘fieldstatistics’ para sacar más información (unique values, por ejemplo), pero eso ya es otra historia…

Saludos.

Carlos.


Teradata Studio Express 14

14 diciembre de 2011

¿Teradata Studio Express 14? ¿Y qué es eso? pensaréis. Como pistas para averiguarlo aparecen en el nombre del invento la palabra ‘Studio’, que sugiere algo con muchas ventanas, botoncitos y opciones, y la palabra ‘Express’, que suele significar ‘gratis’. También es una pista el número 14…

Pues bien, lo que hay detrás de este nombre tan nuevo y molón no es más que la nueva versión del SQL Assistant Java Edition (sqlaj) de toda la vida, cuya última versión conocida era la 13.10. Se ve que alguien del mundo del marketing ha decidido que así suena mejor, o que es mejor que su nombre no se parezca tanto al de su ‘primo’ el Teradata SQL Assistant.

Tras descargarlo e instalarlo vemos que el icono del escritorio y la ventana ‘splash‘ han sido rediseñadas (y creo que mejoradas). También hay que decir que la versión instalada (mediante un ‘windows installer‘) se comporta mucho mejor que la anterior, pues comprueba y elimina la versión anterior (sqlaj13.10) pero mantiene los ‘settings‘ y preferencias existentes. (La instalación de la 13.10 me dejó intacta la versión 13.01 y no heredó nada del entorno, preferencias, conexiones, etc… así que durante un tiempo -hasta que eliminé a mano la antigua- tuve las dos versiones instaladas y además tuve que configurar la nueva ‘desde cero’).

Teradata Studio Express 14

Teradata Studio Express 14

Tras un primer vistazo se aprecian nuevos ‘connection profile types‘ para diferentes SGBDR’s y algunas otras mejoras (muy útiles los ‘SQL Editor Templates’, aunque sólo se puede acceder a ellos con ‘ctrl-space’), aunque hay que decir que mientras estaba navegando por los menús y preferencias la aplicación se cerró inesperadamente… (sin olvidar que nada más arrancar se traga 220 MB de memoria RAM)

Mil veces he dicho aquí que no soy muy ‘fan’ de las herramientas ‘GUI’. Y algo que en su nombre lleva las palabras ‘Studio’ y ‘Express’ no parece ser lo más indicado para que cambie de opinión, pero aun así vamos a jugar un poco con él durante unos días. A ver qué pasa…

¡Ah! Se me olvidaba: os podéis descargar la aplicación desde aquí.

Saludos.

Carlos.


El iPhone y el WiFi…

10 diciembre de 2011

Cada cierto tiempo el iPhone se vuelve más y más perezoso con la WiFi… hasta que deja de funcionar. La ruedecilla de palitos se eterniza girando y no hay forma de que el cacharro se conecte. Entonces lo que hago es:

Ajustes->General->Restablecer->Restablecer ajustes

Y es mano de santo. Durante una temporada las comunicaciones WiFi, si no maravillosas (creo que aquí el difunto señor Jobs no anduvo muy fino) sí al menos funcionan a velocidad razonable.

Saludos.

Carlos.


Now listening to…

30 noviembre de 2011

Estos días estoy escuchando a Randy Newman, Live In London. Buenísimo. Y divertidísimo.

Saludos.

Carlos


Backup a 9 GB/min.

21 noviembre de 2011

Haciendo pruebas de rendimiento de los backups, con un simple ‘arcmain’ y sin hacer mucho esfuerzo:

SuSE64-1:/var/opt/teradata # cat /tmp/bk_bigtable.out
11/21/2011 15:53:30   Copyright 1989-2007, NCR Corporation.
11/21/2011 15:53:30   All Rights Reserved.
11/21/2011 15:53:30
11/21/2011 15:53:30     ***   ****    ****
11/21/2011 15:53:30    *   *  *   *  *        PROGRAM: ARCMAIN
11/21/2011 15:53:30    *****  ****   *        RELEASE: 12.00.00.10
11/21/2011 15:53:30    *   *  *  *   *        BUILD:   070177eLX (Oct  1 2009)
11/21/2011 15:53:30    *   *  *   *   ****
11/21/2011 15:53:30
11/21/2011 15:53:30  RESTARTLOG = ARCLOG111121_155330_32684.rlg
11/21/2011 15:53:30
11/21/2011 15:53:30  PARAMETERS IN USE:
11/21/2011 15:53:30
11/21/2011 15:53:30  SESSIONS 25
11/21/2011 15:53:30
11/21/2011 15:53:30  FILEDEF - MAP INTERNAL FILES TO EXTERNAL DEFINITION:
11/21/2011 15:53:30  INTERNAL FILE  EXTERNAL FILE
11/21/2011 15:53:30  =============  ============================
11/21/2011 15:53:30         BKBITA  /var/opt/teradata/backup/BKBITA
11/21/2011 15:53:30
11/21/2011 15:53:30
11/21/2011 15:53:30
11/21/2011 15:53:30  CHARACTER SET IN USE: ASCII
11/21/2011 15:53:30  LOGON MY_DB/usrbackup,;
11/21/2011 15:53:30  LOGGED ON 3 SESSIONS
11/21/2011 15:53:30
11/21/2011 15:53:30  DBS LANGUAGE SUPPORT MODE Standard
11/21/2011 15:53:30  DBS RELEASE 12.00.03.33
11/21/2011 15:53:30  DBS VERSION 12.00.03.33
11/21/2011 15:53:30
11/21/2011 15:53:30  STATEMENT COMPLETED
11/21/2011 15:53:30
11/21/2011 15:53:30  archive data tables (DB01.BIGTABLE) ,
11/21/2011 15:53:30  indexes,
11/21/2011 15:53:30  release lock,
11/21/2011 15:53:30  file = bkbita ;
11/21/2011 15:53:30  UTILITY EVENT NUMBER  - 644427
11/21/2011 15:53:34  LOGGED ON   25 SESSIONS
11/21/2011 15:53:34  BKBITA MAPPED TO /var/opt/teradata/backup/BKBITA.
11/21/2011 15:53:36
11/21/2011 15:53:36  ARCHIVING DATABASE "DB01"
11/21/2011 15:54:26  TABLE "BIGTABLE" -   9,634,712,600 BYTES,
                     61,617,103 ROWS ARCHIVED
11/21/2011 15:54:26  "DB01"."BIGTABLE" - LOCK RELEASED
11/21/2011 15:54:26  DUMP COMPLETED
11/21/2011 15:54:26  STATEMENT COMPLETED
11/21/2011 15:54:26
11/21/2011 15:54:26  logoff;
11/21/2011 15:54:30  LOGGED OFF  28 SESSIONS
11/21/2011 15:54:30  STATEMENT COMPLETED
11/21/2011 15:54:30
11/21/2011 15:54:30
11/21/2011 15:54:30  ARCMAIN TERMINATED WITH SEVERITY 0

SuSE64-1:/var/opt/teradata #

Lo que nos da unos bonitos 9 GB por minuto (o lo que es lo mismo: 150 MB/s ó 540 GB por hora)

¿No está mal, no?

Saludos.

Carlos.


Seguir

Get every new post delivered to your Inbox.