Archivos Diciembre 2008

30

Dic

La Query perezosa II

Ya hace algunos días les platique sobre una o más bien dicho unas cuantas consultas perezosas, que con el cambio de servidor su tiempo de ejecución se fue por los cielos, y como también les explique, no había mucho que yo pudiera hacer, al menos no en el servidor, es decir no podía modificar las vistas o los índices que existen en la base de datos.

Siendo honesto, en lo personal no me importaría mucho el tiempo que tarde la consulta en ejecutarse, ya que a final de cuentas yo no voy a ser el usuario del sistema hace uso de esas consultas,  pero a la vez podría decirse que el hecho de mejorar el tiempo de respuesta de las consultas lo tome como algo personal, y más  aun cuando una de las personas que trabajan en la empresa dueña de la base de datos me comento que ella había logrado reducir una consulta de 20 minutos a solo 15, y que eso era suficiente, tomando en cuenta la cantidad de datos que contiene la tabla sobre la que operaba.

Con eso en mente, y sabiendo que tanto la persona que labora con el cliente como yo, estábamos utilizando la misma tabla, me puse a averiguar bien cual era el problema especifico. Lo primero que hice fue buscar sobre el desempeño de Oracle, sobre todo con tablas grandes como la que nos ocupaba. Enseguida salto a mi vista que la tabla que yo llamaba grande, en realidad era una tabla de proporciones medianas, para Oracle, ya que en algunas cuantas páginas me tope con personas diciendo que sus consultas se tardaban algunos cuantos segundos cuando las ejecutaban, claro que de entrada aclaraban que su tabla contenía alrededor de 20 millones de  registros, o alguna cantidad mayor a 10 millones, que obviamente superan por varias veces a la cantidad de datos que hay en nuestra tabla. En casi todos los casos el culpable era un índice que o estaba mal formado, es decir que no contenía todos los campos que requería o que de plano no existía. En todos los casos se logro reducir el tiempo de las consultas a milisegundos, gracias a que se hicieron los cambios pertinentes en los índices. Por desgracia, para mi la historia era otra, yo no puedo modificar los datos almacenados en la tabla y no se diga la estructura de la tabla. Si alguien alguna vez ha estado al frente de un servidor, sabrá que como administrador, no te gusta y sobre todo no aceptas que alguien de fuera, venga a decirte como llevar tu servidor, y un administrador de Base de Datos no es la excepción, si yo tengo la responsabilidad de mantener esto funcionando, porque voy a admitir que alguien más venga a decirme como debo de hacerlo, cuando si algo sale mal al que van a culpar es a mi y no a esa persona. Por lo tanto, agregar el índice estaba totalmente descartado.

Para resolver este tipo de problemas, normalmente basta desempolvar aquellas viejas enseñanzas de Bases de Datos que seguramente llevaste. En los que en vez de ver un manejador de Bases de Datos como FoxPro o DBIII, viste Teoría de Conjuntos, Algebra Relacional y las sentencias de SQL. Como se que la mayoría estará en el primer caso, es decir que vieron un manejador y no SQL, explicare paso a paso como resolver estas cosas. Pero para los que no requieren tanto rollo, basta decir que lo primero es crear un subconjunto usando el índice con clave del empleado, y de ahí seleccionar los que cumplan el criterio completo de nuestra consulta.

Gracias a que yo ya me quebré la cabeza un poco, veremos que salir de este tipo de encrucijadas es de lo más sencillo.

Aquí hay que hacer la aclaración que estas tablas, y las consultas son ficticias, y que si bien se parecen a las reales en algunas cosas, en muchas difieren.
Lo primero es conocer nuestra consulta y la tabla.

La tabla (en este caso vista) esa la siguiente:
vPagosEmpleados.-
  • Clave: Clave del empleado
  • Concepto: Concepto del pago
  • Cantidad: Cantidad del pago
  • Periodo: Periodo en el que se realiza el pago.

Y nuestra consulta tiene que calcular que pago neto recibió nuestro empleado en cada periodo. Por lo que sumaremos los pagos por periodo, dada una matricula.

Select sum(cantidad) cantidad, periodo
From vPagosEmpleado  
Where clave = _clave
Group by periodo
Order by periodo Desc;

_clave es el parámetro con la clave a buscar.

23

Dic

Otra historia de Vundo

Ayer cuando llegue a mi casa, mi primo que acababa de llegar de USA, me comento que su laptop estaba fallando, que de repente la barra de tareas se desaparecía, y que de repente volvía a aparecer. Mientras cenábamos me comentaba acerca de que tenia el LimeWire, programa que yo también tengo, cosa a la que no le di mucha importancia. Cuando termine de cenar, me dispuse a revisar la laptop, que para mi mala fortuna y sobre todo mi desagrado la computadora tenía instalado Vista Home Premium. Al principio no tenia ni la más minima idea de que era lo que estaba ocasionando dicho comportamiento de la barra de tareas, pero como suele ser mi costumbre abrí el Administrador de tareas y fui terminando procesos de una forma controlada y ordenada. Tengo que reconocer que de vista no se casi nada, no había tenido la oportunidad de meterme a fondo en las tripas de alguna maquina con dicho sistema operativo, sin embargo me sentí como en casa, es decir los mismo procesos, los mismos nombres de archivos, y demás cosas, claro que adornados con muchos procesos en su mayoría inútiles y uno que otro servicio nuevo.  
  Todos los procesos se comportaban de una forma normal, hasta que llegue al LimeWare, que sin importar cuantas veces lo terminara, este volvía a ser ejecutado por otro proceso hasta el momento desconocido. Cuando trate de borrar el limeware de forma manual y no conseguir hacerlo, me dije, hay que traer la caballeria pesada, así que fui a mi computadora y baje el process Explorer, actor seguido revise quien estaba lanzando el proceso del limeware y lo pause, y así, termine el limewire y fui y borre la carpeta en la que este estaba instalado. El siguiente paso era deshacerse del proceso, que tenia un nombre bien Microsoft, un nombre que fácilmente se confunde con un proceso bien conocido en Windows, me refiero a svchost.exe,  claro que ya con process Explorer, supe donde se encontraba, sin embargo al llegar a la carpeta en la que se suponía que estaba el mencionado archivo, me tope con muchos archivos exe, zip, tmp entre otros, pero ninguno era mi blanco. Claro que elimine todos esos archivos que sin duda alguna eran parte de la infección. El hecho de que el ejecutable se encontrara en esa carpeta, pero que no fuera visible, me hizo suponer que teníamos un típico cazo de rootkit, el cual solo ocultaba el archivo, pero no el ejecutable. Sin más hice algo que aprendí hace tiempo atrás, que es ejecutar un comando el cual llena el archivo con otro contenido, concretamente seria a así:

Echo > svchost.exe


Lo cual debería de haber bastado, pero en este caso me devolvió un Acceso denegado, lo cual me hizo suponer que alguien más lo estaba cargando. Cuando vi esto, reinicie la maquina en modo seguro, sin embargo obtuve el mismo resultado, pero esta vez intente algo más, usar el comando

Copy con svchost.exe

21

Dic

GuitarTools plugin para MTOS y MT


Descargar
Este plugin nos permite agregar tablaturas de guitarra a nuestras entradas de una manera elegante. Tiene dos formas de hacerlo, una es con una imagen y la otra con un texto. La siguiente canción de Zurdok, Abre los ojos, es la que usaremos para demostrar el como utilizar este plugin.
Primeramente usaremos el modo texto que es el siguiente:

Abre lAa ventana y vFe la luBz delEm sol
Abre lAa ventFana y mírBate
AbCre losD ojos bieAn
Abre los ojos bien. D    A

Salte Ade la casa y Fmira alrBededoEmr
Salte Ade la Fcasa y búBscame
ACbre loDs ojos biAen
Abre los ojos bien. D    A   E (7 veces)   

Esta oscEmuridFad
Dte quiere ahEmogar
Dte quiere matAar  Em    D
AEsta oscEmuridFad
Dte quiere ahEmogar
Dte quiere olvAidar

Luego presentamos las notas usadas:

El código que genera esto es el siguiente:
[lines:
Abre l{-A}a ventana y v{-F}e la lu{-B}z del{-Em} sol
Abre l{-A}a vent{-F}ana y mír{-B}ate
Ab{-C}re los{-D} ojos bie{-A}n
Abre los ojos bien. {-D}    {-A}

Salte {-A}de la casa y {-F}mira alr{-B}ededo{-Em}r
Salte {-A}de la {-F}casa y bú{-B}scame
A{-C}bre lo{-D}s ojos bi{-A}en

Abre los ojos bien. {-D}    {-A}   {-E (7 veces)}   

Esta osc{-Em}urid{-F}ad
{-D}te quiere ah{-Em}ogar
{-D}te quiere mat{-A}ar  {-Em}    {-D}
{-A}Esta osc{-Em}urid{-F}ad
{-D}te quiere ah{-Em}ogar
{-D}te quiere olv{-A}idar
]

[chord:A F B Em D]

19

Dic

Días de ocio total

Hoy es viernes y como suelen decir, hoy toca, y si hoy toca estar de ociosos, así que me puse a buscar algunas cuantas formas de pasar el tiempo. Encontré algunas cuantas, pero para muchos no será del todo agradables, ya que no mucha gente disfruta de las mimas cosas que yo, por ejemplo no todo el mundo disfruta escribiendo entradas en su blog,  o leyendo sobre la api de algún CMS como drupal entre otras cosillas que suelo hacer. Pero lo que si la mayoría disfrutamos es de los juegos en Internet.
    Como sabemos existen muchas páginas dedicadas a este tema, en las que encontraras una diversa gama de juegos, desde los clásicos tetris, pacman, algunos cuantos Scooter, pasando por juegos de mesa y demás. A mi en lo personal me gustan mucho los juegos de disparos, sobre todos en los que eres francotirador, tal vez por que se que para mi es casi imposible llegar a ser uno, primeramente porque nunca lo he estudiado y en segundo por mi miopía, que es considerable.

Si bien este tipo de juegos me divierte mucho, de vez en cuando esta bien dar un pequeño giro y probar cosas nuevas, por lo que esta vez decidí jugar otra cosa, y dije porque no un jueguito de Backgammon, y pues encontré varios sitios en donde jugarlo.
 Entre los sitios que más me llamaron la atención fueron:
 
http://www.bgprime.com

http://www.1on1backgammon.com


Si en este momento, están de ociosos, al igual que yo, pueden ponerse a jugar un buen juego de Backgammon o cualquier otro que se les antoje.

Saludos

 

17

Dic

Google Y yahoo concuerdan

Si señores así es tanto yahoo como google avalan que mixelandia es  uno de los mejores lugares para buscar imágenes para metroflog y fotolog, pero como siempre lo hemos dicho una imagen habla mas que mil palabras, los dejos con los resultados de las búsquedas.

imagenes para metroflog


La búsqueda de imágenes para metroflog en google nos pone en la tercera posición

imagenes para metroflog
La misma búsqueda en Yahoo nos coloca en la primera posición.


17

Dic

Joost Sale del aire

Pues resulta que debido al gran exito que los señores de joost han obtenido, han decidido sacar su programa del aire. Pero no se asusten, aun se podran seguir viendo videos en joost.com.

"In October, we introduced our new website - Joost.com. With our new website, you're able to watch all of our videos - TV shows, music videos, and films - right in your web browser.

At this point, we have decided to discontinue our original Joost software application. As of Friday, Dec. 19th, you will no longer be able to watch videos in the Joost software application - but you will be able to find all of our videos, and more, on Joost.com"



Por lo que apartir del 19 de diciembre solo se podran ver videos de joost, a travez de el sitio joost.com.

Saludos

10

Dic

FastTagCloud Mi segundo Plugin

Recientemente en la lista de correos de ProNet de Movable Type, Justin Mc hizo algunas cuantas observaciones con respecto al tiempo que tomaba en publicarse su un blog clonado,  con apenas 300 entradas y 500 comentarios,  el cual era de 20 a 25 minutos, y en ocasiones llego a estar cercas de los 48 minutos. Bien Yo tenia el mismo problema, mi blog se tardaba alrededor de 40 minutos cuando lo publicaba por completo. En mi mixelandia tengo 420 entradas, y 1161 comentarios, por tal motivo, creía que el tiempo de publicación era una exageración.

Afortunadamente Justin descubrió la raíz del problema, la Nube de Etiquetas, la cual estaba tomando mucho tiempo para ser creada, y una vez que era retirada de las entradas, el blog volvía publicarse en un tiempo aceptable. Una vez que supe la causa de la lentitud en la publicación, retire la nube de etiquetas, y en efecto el tiempo de publicación descendió a unos 4 o 5 minutos, lo cual desde mi punto de vista es más que aceptable.

El único detalle es que me gusta mucho la nube de etiquetas, se ve muy bien y describe hacia donde va orientado mi blog, por lo que busque una solución. La verdad es que las etiquetas no han sido la parte medular de MTOS, ya que en un principio ni siquiera existían, solamente había categorías y palabras relacionadas. Como no encontré algún plugin que generara una nube de etiquetas, que no sacrificara tiempo en hacerlo, me decidí a hacer mi propio plugin, el cual tenia como propósito generar una nube de etiquetas, a la mayor velocidad posible. Si bien no soy un gran programador en perl, y tampoco conozco mucho de plugins para MTOS, no hay  mucho en lo que san Google no nos pueda decir como hacerlo y hay que recordar que no vamos a reinventar la rueda, es decir que vamos a tomar el sistema de ranking de MTOS y hacerlo veloz.

Por tal motivo, me base en el código en php de mt:TagRank, claro que lo modifique un poco, esto para evitar tanta consulta a la base de datos. Por lo tanto puede que las etiquetas no queden igual a el ranking original. Además tome un poco de código para generar la ruta hace CCIPath. Fuera de eso, el ranking es muy rápido, por lo que logre el objetivo del plugin, generar una nube de etiquetas muy rápida.

Básicamente lo que hace lentas las cosas en la nube de etiquetas de MTOS son las consultas ala base de datos, y cada vez que se genera la nube, se hacen varias llamadas a la base de datos por etiqueta. En el caso de este plugin, solo se hace 1 llamada a  la base de datos, además utilice una especie de cache interno con lo que las llamas a la base de datos se reducen a 1 por todo el tiempo en el que este cargado el plugin. Esto lo hace muy veloz en comparación a usar la nube de etiquetas normal. En la prueba de fuego, el resultado no pudo ser mejor, ya que publicar todo el sitio tardo solamente 6 minutos en promedio, llegando a terminar en tal solo 4 minutos y medio.

Bien los dejo con FastTagCloud para MTOS.

Saludos

02

Dic

Día de enseñanza... la query peresoza

Hoy fue un día lleno de aprendizaje, que empezó con una query, que en su momento estaba funcionando de manera adecuada, sin ningún pero, al menos yo no tenia algún problema con ella y creo que ella tampoco conmigo. Todo iba muy bien, hasta que hace unos días nos cambiaron un servidor, sobre el que estábamos trabajado, o no se exactamente que cambio hubo, lo que si se es que el desempeño del servidor se vio mermado de una manera muy notoria, ya que otra query que se encargaba de obtener unos datos del trabajador no tardaba ni medio segundo en ejecutarse, pero ahora tarda cercas de 5 minutos, lo cual es una caída en la velocidad de procesamiento enorme,  achacable a el cambio que se realizo hace poco tiempo.
Normalmente calcular el sueldo de un empleado no es mucho problema, ya que este se suele guardar de esa manera, como un valor absoluto, es decir si gano 1000 pesos, eso es lo que se guarda, pero en este caso cada fulano puede tener varios sueldos, varias prestaciones entre otras cosas. Así que para calcular el sueldo hay que sumar todas esas percepciones, lo cual en teoría no es difícil, porque quien no recuerda sus clases en la escuela en las que veías ese tipo de situaciones, nada que un simple sum y un group by no puedan resolver. El detalle esta en que ya no es la escuela y esas bases de datos de 100 o 1000 registros, sino que estamos hablando de bases de datos sacadas de entornos de operación, donde se tienen al rededor del millón y medio de tuplas. Y es ahí donde se diferencian los hombres de los niños, donde cualquier detalle en tu consulta puede hacer que los tiempos de ejecución de las mismas se vuelvan casi eternos, claro esta esto desde el punto de vista de los programadores.

Aquí hay que agregar algo, el hecho de que no estoy trabajando sobre tablas directamente, sino sobre vistas, y que no tengo ningún derecho sobre las tablas desde las que salen esas vistas, es decir que no puedo generar mis indices personalizados, dejar fuera campos que no requiero u optimizar la consulta que genera esa vista. Así que tenemos un típico caso de Caja negra, en la que no sabemos que esta pasando adentro, solo vemos los resultados, a por cierto tampoco puedo ver la query que hace la vista. Por lo que estoy amarrado de manos.

De cualquier manera, las subquerys, el operador in y los inner joins son los mejores aliados en este tipo de situaciones....

Continuara