martes, abril 15, 2014

Resuelto el misterio del año 0000!.

Hoy, gracias a una discusión a tres bandas en twitter con Tony Doval @tonydoval, Xavier Picamal @Condebond y Elias Fernández @sailefm se ha resuelto por fin el misterio del año 0000 en algunas de mis bases de datos.

¿Quién localizó el bug? El premio es para Elias Fernández! (que se lleva mi más sincero "me quito el sombrero").

La cuestión es que el año 0000 no existe, aunque en algunas bases de datos he visto lo siguiente:

SQL> select * from zero_leap_year
  2  where to_char(date_year,'yyyy')='0000' and rownum<6;

DATE_YEAR
--------------------
30-DEC-0000 00:00:00
30-JAN-0000 00:00:00
30-DEC-0000 00:00:00
29-FEB-0000 00:00:00
30-JAN-0000 00:00:00

El año 0000 no existe. Del año 1 antes de Cristo se pasa al año 1 después de Cristo. Cualquier forma de insertar un año 0000 o una fecha 29-febrero en un año no bisiesto dará los siguientes errores:

SQL> insert into zero_leap_year values ('29-FEB-2007');
insert into zero_leap_year values ('29-FEB-2007')
                                   *
ERROR at line 1:
ORA-01840: input value not long enough for date format


SQL> insert into zero_leap_year values (to_date('29-02-2007 00:00:00','dd-mm-yyyy hh24:mi:ss'));
insert into zero_leap_year values (to_date('29-02-2007 00:00:00','dd-mm-yyyy hh24:mi:ss'))
                                           *
ERROR at line 1:
ORA-01839: date not valid for month specified


No obstante, estas filas misteriosas seguían apareciendo. Tanto en versión Oracle9i, Oracle10g y Oracle11g. ¿Cómo han podido colarse? Muy probablemente como Elias Fernandez encontró: partiendo de una fecha como, por ejemplo, 1-enero del año 1, restarle 1 día. Voilà! 

SQL> select (TO_DATE('01/01/0001 00:00:00', 'DD/MM/YYYY HH24:MI:SS') - 1) from dual;

(TO_DATE('01/01/0001
--------------------
31-DIC-0000 00:00:00


No sólo eso... ese año 0000 que no existe en la historia, según Oracle, es bisiesto!

SQL> select (TO_DATE('01/01/0001 00:00:00', 'DD/MM/YYYY HH24:MI:SS') - 307) from dual;

(TO_DATE('01/01/0001
--------------------
29-FEB-0000 00:00:00


Esto es un bug en toda regla!

viernes, marzo 28, 2014

"Optimización SQL en Oracle" disponible en Kindle.

Hoy ha salido a la venta el libro "Optimización SQL en Oracle" en formato Kindle.


Aun hay esperar a que Amazon vincule la edición impresa y la electrónica (dicen que sobre unas 48 horas), sobre todo porque el libro está en Amazon Matchbook, que permite que quien ha comprado la edición impresa pueda descargarse el libro en Kindle gratis, aunque creo que esta opción sólo está disponible en amazon.com por el momento.

¿Por qué ha tardado tanto en salir la edición Kindle?

Para empezar, porque es un libro concebido para un tamaño concreto. Está lleno de líneas de código y outputs de pantalla (en ocasiones con anchos de línea de 140 o 160 caracteres) para que los planes de ejecución puedan leerse correctamente. El libro impreso tiene un tamaño de ancho y alto de 9.6 pulgadas x 6.7 pulgadas (24,6cm x 17cm) y otras pruebas de impresión a formatos más reducidos perdían legibilidad. ¿Has visto alguna vez un plan de ejecución con explain plan en tu iPhone? Complicado.

¿Por qué una edición en Kindle?

Personalmente, pienso que la edición impresa es de lujo. La calidad de impresión es ideal, los contenidos están indexados por palabras al final del libro y, por lo que nos han comentado los lectores, vale la pena tenerlo impreso y leerlo de principio a fin. La maquetación de los contenidos y las imágenes están ajustadas al tamaño del papel. No obstante, tenerlo en papel implica en ocasiones unos gastos de envío (en ciertos países con fuertes cargos de aduana) y unos tiempos de espera considerables.

Con esta edición, el libro puede estar disponible inmediatamente en los dispositivos digitales, y gratis para quien haya adquirido el libro en Amazon (que imagino que serán los usuarios de Kindle), con actualizaciones de contenido que las impresiones registradas con ISBN en papel no permiten, con todas las ventajas que la lectura electrónica ofrece como búsqueda de palabras, diccionario, lectura práctica, lectura en el PC con copy/paste directamente del código del libro, etc.

¿Cómo se han resuelto estos aspectos de visualización?

Para empezar, el libro incluye embebida una fuente gratuita Courier Prime para que el código y el resultado se vea lo más parecido al libro impreso. La mayoría de problemas de se resuelven reduciendo la fuente o usando la visualización horizontal.  ADVERTENCIA! No obstante, en ciertos dispositivos como iPhone o Kindle2 (el más pequeño), algunos planes de ejecución más complejos se pueden leen con cierta dificultad.

En estos casos, lo más recomendable es descargarse el código SQL de ejemplo de la web y seguir la lectura practicando con los ejemplos sobre la base de datos.