Archive for the ‘Bases de datos’ Category

Tomar el tiempo de ejecución de una consulta en Informix

Miércoles, Diciembre 3rd, 2008

Una forma fácil y rápida de tomar el tiempo de ejecución de una consulta SQL en el motor Informix


time dbaccess BASE_DE_DATOS consulta.sql

Database selected.
23822 row(s) retrieved.
Database closed.

real 0m57.901s
user 0m1.310s
sys 0m0.330s

Que sifnifica cada cosa:

Real
El tiempo total para completar la query

User
Del tiempo total, esto es el tiempo de CPU del usuario

Sys
Del tiempo total, esto es el tiempo de CPU del sistema

minmsecs
El tiempo está en min minutos, sec segundos

Post relacionado: Explain en informix

SQL de paises y estados

Sábado, Octubre 25th, 2008

KEYWORDS: SQL COUNTRIES STATES PROVINCIAS ESTADOS CONSULTA QUERY DATABASE

Útil si alguien está haciendo alguna web que necesite estos datos (ya que la ISO los cobra, shame on you fucking ISO).
Están en español.
Las consultas ddl de las tablas están preparadas para PostgreSQL.

sql_paises_estados

Para que sea estandar faltaría:
-Agregarle dos o tres países que figuran en la ISO y en esta no.
-Agregarle los códigos de país ISO 3166-1-alpha-2, alpha3 y numérico (por ej. Argentina ‘AR’ ‘ARG’ ‘032′ )
-Vincular por código alpha 2 en vez de por id

Sacados de foros del web y modificados a mano.

AddDefaultCharset on malo !

Lunes, Julio 28th, 2008

Ultimamente que descubrí que UTF8 es la verdad en juegos de caracteres ( y no lo digo yo lo dice Dios), ya que es el único creado para contener todos los caracteres de todos los idiomas (el nuevo estandar, nada puede salir mal digamos ya que utilizar los caracteres Unicode).

Me estoy enfermando para pasar todo a este juego de caracteres y olvidarme de los problemas de una buena vez.

Para lograr esto tuve que luchar un poco ayer, y hoy aprendí algo nuevo en mi lucha diaria, esta vez sobre la configuración de apache 2.

Resulta que trae esta línea en el archivo apache2.conf :

AddDefaultCharset on

y esta en la configuración de los sitios virtuales:

AddDefaultCharset ISO-8859-1

por defecto pisando (override) lo que los documentos web especifican en sus declaraciones. Esta directiva de configuración (si bien nos puede sacar de algún apuro) esta considerada como una herejía, 2.

Lo ideal es sacarla, en lo posible o con:

AddDefaultCharset off

En el archivo de configuración principal (apache2.conf),o bien quitando:

AddDefaultCharset CHARSET (CHARSET es el juego de caracteres especificado en cada caso)

del archivo de configuración de un sitio en particular.

Parece que no solo a mí me pasó.

Asi que ya saben UTF8 en todos lados:

editores de texto,
consolas,
sistemas operativos,
documentos,
servidores,
bases de datos (atención: link recursivo jaja),
lenguajes de programación,
etc.

Piensen de esta manera, el día de mañana en las materias como programación se va a hablar del UTF8 como hoy lo hacen del ASCII (estandar por muchos años que solo consideraba el idioma inglés).

Saludos !

convertir de latin1 a utf8 en mysql

Domingo, Julio 27th, 2008

Estuve todo el día tratando de hacerlo pero lo logré. Migré una DB con default charset ISO-8859-1, osea latin1, a utf8 en mysql (motor de base de datos con el que no simpatizo para nada).

La idea es exportar los datos crear una base nueva con el juego de caracteres utf8 y luego importar los datos en la nueva base de datos.

La forma de hacerlo es la siguiente:

1) Pasamos el contenido de la base de datos a un archivo de texto plano (asegurándonos exportarlo en el charset adecuado).

mysqldump -u USUARIO -p BASEDEDATOS –default-character-set=latin1 > backup.sql

2) ingresamos a la consola

mysql -u USUARIO -p

creamos una dase de datos nueva con el charset bien configurado en utf8:

CREATE DATABASE nombre_base_nueva CHARACTER SET utf8 COLLATE utf8_general_ci;

3) Eh aquí el paso mágico que no me salia y encontré en internet después de un buen rato

Convertimos de un charset a otro sin perder información:

iconv -f ISO-8859-1 -t UTF-8 backup.sql > backup_utf8.sql

Luego cambiamos las sentencias de armado de la base para que conincidan cuando creemos la nueva.
Yo lo hize con un editor de textos y con search and replace (el editor de textos debe soportar utf-8 !!)
pero también se puede hacer así:

perl -pi -w -e 's/CHARSET=latin1/CHARSET=utf8/g;' backup_utf8.sql

4) por último importamos los datos a la base nueva utf8
mysql -u USUARIO -p nombre_base_nueva –default-character-set=utf8 < backup_utf8.sql

Fuente: Gentoo-wiki

Plan de ejecución en Informix

Martes, Octubre 30th, 2007

Para poder visualizar el plan de ejecución de una consulta en informix tenemos que hacer lo siguiente:

Antes de alguna consulta ponemos

SET EXPLAIN ON;
CONSULTA;

luego buscamos en el directorio home de nuestro usuario el archivo sqlexplain.out donde podemos ver el plan de ejecución elegido por el optimizador del motor de base de datos.
Esta directiva dura para toda la conexión, es decir, si trabajamos en una consola y la cerramos en el futuro no grabará los planes de ejecución en ese archivo a menos que se lo especifiquemos con el comando SET EXPLAIN ON.

slds,
Correcciones, comentarios bienvenidos.

Exportar / importar / backup Postgre SQL

Jueves, Octubre 11th, 2007

Hoy tuve que realizar un back up en postgre sql (v8.1) y se sorprendió lo rápido y efectivo que fue:

pg_dump base_de_datos > base_de_datos-fecha.sql

ingrsando a la consola:

#> psql

ejecutamos:

psql> CREATE DATABASE backup;

salimos

psql> \q

y ejecutamos

psql backup < base_de_datos-fecha.sql

y listo backup realizado.

Si alguien sabe más sobre el tema comentarios bienvenidos ! (aunque sea en otro motor, todo sirve)

Diseño de modelos de datos web !

Jueves, Agosto 30th, 2007

POR FIN !! basta de instalar 1000 aplicaciones de escritorio con 1000 restricciones distintas ya sea del lenguaje, la plataforma, las características, los lenguajes, etc. Basta ! si bien esto no es lo más completo que existe por lo menos no hay que instalarlo !

SQL Designer

y una demo

Autor

Deadlocks en web

Domingo, Agosto 19th, 2007

Microsoft OLE DB Provider for ODBC Drivers error ‘80004005′ [Microsoft][ODBC SQL Server Driver][SQL Server]Transaction (Process ID 156) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. /efytimes/lefthome.asp, line 193

Andando por ahí me encuentro en un blog con que alguien encontró un ejemplo de deadlock en la vida real web, cosa no muy vista. Para aquellos que cursaron una materia que cubra estos contenidos en la facu esto puede ser interesante.

Además de regalo un repaso de la teoría por un profesor de la materia supongo.

Via: El Blog de Ricardo Galli

Para Microsoft, Ubuntu es “perfecto” (CHAN!)

Viernes, Junio 29th, 2007

Parece que en una página M$ se deschabó, si bien la sacaron rapidamente de internet. dios, digo google, guardó una copia.

EAT M$

Acá está la noticia que salio en La Nación diario.

Problema de fechas en informix aritmética de meses

Viernes, Junio 8th, 2007

Si bien considero a informix como un buen motor de base de datos, ciertas cosas en las consultas no estan del todo bien documentada, por ej: las fechas.

El problema en particular que tube fue resrando meses. La solución es esta:

SELECT (TODAY) - 3 UNITS MONTH
FROM tabla

(la palabra TODAY significa la fecha actual .. la misma puede ser cambiada por cualquier fecha, se deben untilizar comillas simples en tal caso)

yo solia solucionarlo de esta manera

SELECT registros
FROM tabla
WHERE
month(fecha)=month(TODAY-90)

pero dependiendo de la situación puede dar errores muy grandes la otra manera que es la que solia utilizar es manejar la consulta con un BETWEEN y resolver las fechas con otro lenguaje que genere la consulta ya sea php, perl o cualquier otro por ej:


//datos pasados como parámetro

$mes=$_GET['mes'];
$anio=$_GET['anio'];

for ($t=1;$t<=3;$t++)
{
if ($mes<=1)
{
$mes=12;
$anio--;
}
else
$mes--;
}

$sql = "
SELECT campos
FROM tabla
WHERE
fecha BETWEEN date('01/$mes/$anio') AND date('01/$_GET[mes]/$_GET[anio]')
";

en el caso que se quiera entre la fecha del principio de un mes y del final de otro la solución sería por ej:

SELECT campos
WHERE
campo BETWEEN MDY(6,1,2007) AND MDY(6+1,1,2007) -1 //MDY es una función para armar datos de tipo date
FROM tabla

lo que estoy haciendo es obtener el último día del mes sumando un mes y restandole un día.

Espero que les sirva. Si notan algún error o tienen alguna situación particular por favor avisenme. Gracias.
Slds

errores comunes en diseño de base de datos

Martes, Mayo 8th, 2007

Lo posteo para leerlo yo después :P.. espero que les sirva ..

errores bases de datos

link

Via: programame

Tips para optimización de consultas mysql

Miércoles, Abril 11th, 2007

Para aquellos que trabajen bastante con mysql y sobre todo en máquinas no muy grandes y con mucha cantidad de datos aca les dejo unos cuantos tips a tener en cuenta para tunning de consultas.

Via: Baluart