Estresa tu SQL server por una buena causa

Seguramente muchos de vosotros, como developers o administradores de bases de datos, habéis sentido la necesidad de ejecutar consultas o sentencias que actualicen vuestras tablas para analizar el performance. Manualmente puede ser algo engorroso si queréis hacer un buen test completo, que afecte a múltiples servidores, bases de datos o tablas. Hoy os presento una solución perfecta, una herramienta, que además de ser fácil e intuitiva de usar, es Free. Se llama SQL Load Generator y podéis descargarla desde aquí. La idea es definir en la aplicación todas las queries que queráis lanzar a la vez, o individualmente, y aportando la información correspondiente de cada Login. Opcionalmente podéis también incluir cualquiera de vuestras aplicaciones.

Aquí os dejo una captura de pantalla de un par de sentencias listas para ser ejecutadas a modo test en mi portátil. Nos vemos.

Manejo de XML en SQL

El tipo de dato XML fue introducido en SQL Server 2005 y expandido con mejoras en SQL Server 2008. Hay 5 métodos de tipo de dato XML disponibles en SQL Server 2008:
  1. query() – Extrae fragmentos de XML desde un tipo de dato XML.
  2. value() – Extrae un valor concreto de un documento XML.
  3. exist() – Busca un nodo. Si aparece devuelve 1, y 0 en caso contrario.
  4. modify() – Actualiza datos XML en un tipo de dato XML.
  5. node() – Divide datos XML en múltiples filas
Todos estos métodos requieren una expresión XPath como parámetro XQuery. Veamos algunos ejemplos:

--Devuelve framento XML con nombre de la ciudad del 3er.actor de la 1ªpelicula de Acción de nuestra tabla Videoclub
SELECT PeliculaDetalle.query('/Peliculas/Peli[1]/Actor[3]/Ciudad')
FROM Videoclub WHERE genero='Accion'

--Devuelve el string con la ciudad del ejemplo anterior
SELECT PeliculaDetalle.value('/Peliculas/Peli[1]/Actor[3]/Ciudad', 'nvarchar(100)')
FROM Videoclub WHERE genero='Accion'

--Chequea existencia de la película con ID=35´entre todas las de acción
SELECT PeliculaDetalle.exist('/Peliculas/Peli[@ID=35]')


FROM Videoclub WHERE genero='Accion'

--Actualiza la edad del 3er. actor de la 1ª película de Acción
UPDATE VideoClub
SET PeliculaDetalle.modify('replace value of  (/Peliculas/Peli[1]/Actor[3]/Edad)[1] with 40')
FROM Videoclub WHERE genero='Accion'

¿A qué esperas para cacharrear con estos métodos en tus XML?. Espero le saques provecho, y como siempre, se aceptan ideas y comentarios sobre vuestras experiencias. ¡Nos vemos!.

PL/SQL

El lenguaje propietario de Oracle es el que vamos a ver en éste y en próximos posts para conocer cómo interactuar a nivel de código con nuestro Oracle SQL Developer, es decir, desarrollar programas que accedan a nuestras bases de datos Oracle. Para ver la salida de la ejecución de dichos programas iremos antes de nada al menú "Ver" de nuestro entorno Oracle SQL Developer, y haremos visible la ventana "Salida de DBMS" (en esta ventana pulsaremos sobre el botón "Activar DBMS_OUTPUT para la conexión que tengamos abierta).

La estructura de todo programa PL/SQL contiene estos 4 bloques:
DECLARE   
-- Aquí declaramos nuestras variables
BEGIN
-- sentencias
EXCEPTION
-- Manejadores de errores
END;
/

Nota.-  Los bloques DECLARE y EXCEPTION son opcionales.

Los principales tipos de datos que podemos definir para nuestras variables son:
NUMBER(longitud total, nº decimales) : datos numéricos
CHAR : strings de longitud fija
VARCHAR2(longitud máxima) : strings de longitud variable (hasta "n" caracteres)
DATE : valores Fecha (formato por defecto DD-MMM-AA)
BOOLEAN : valores True, False o NULL

Veamos un sencillo ejemplo para visualizar la suma de dos variables numéricas:
DECLARE
N1 NUMBER;
N2 NUMBER;
RESULT NUMBER;
BEGIN
N1:=4;
N2:=5;
RESULT:=N1+N2;
DBMS_OUTPUT.PUT_LINE(RESULT);
END;

/

Y ahora otro ejemplo, incluyendo un manejador de errores en el caso de una división por cero:
DECLARE
N1 NUMBER:=20;
N2 NUMBER:=0;
RESULT NUMBER;
BEGIN
RESULT:=N1/N2;
DBMS_OUTPUT.PUT_LINE(RESULT);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('ERROR: División por cero!');
END;

/

Así concatenaríamos constantes y/o variables strings, usando el constructor "||":
DECLARE
nombre varchar2(50):='JOSE GAITAN';
BEGIN
DBMS_OUTPUT.PUT_LINE('Hola, me llamo ' || nombre);
END;

/
Para visualizar variables numéricas concatenadas con strings debemos hacer una conversión a texto, usando el comando to_char(variable). También es posible declarar constantes, es decir, variables que no cambiarán su valor en el transcurso del programa. Para ello usaremos la palabra reservada Constant. Un ejemplo:
mi_cumple Constant DATE:='23-NOV-1973';

Podemos declarar variables, de igual modo que lo hacemos con columnas en una tabla SQL, para que no admitan valores nulos (lógicamente haríamos siempre una inicialización). Ejemplo:
saldo numeric NOT NULL:=200;
Para concluir este primer post de introducción os diré que también es posible editar vuestro código desde SQL Plus directamente (sin usar el IDE). Para ello usad el comando ed nombre_fichero , así como para ejecutar dicho fichero hay que usar @nombre_fichero. Hasta la próxima.

Fruta fresca: Windows Phone Mango

Hoy vamos a acercarnos al sistema operativo de Microsoft para móviles, Windows Phone. Lo primero será bajarnos el SDK desde aquí. Como podéis ver será la versión 7.1 la que instalaremos. Una vez instalada, procederemos a crear nuestro primer proyecto WP en Visual Studio 2010, donde veremos algunas novedades en los tipos de proyecto cuando seleccionamos la opción de crear un proyecto nuevo.

Nuestro primer proyecto WP va a consistir en desarrollar una aplicación que acceda a la cámara, mostrando un video y nos permita realizar fotografías y guardarlas. ¡Comencemos!.

Empezamos creando un nuevo proyecto Windows Phone Application. A la rejilla principal de MainPage añadimos un divisor de filas para el botón de la parte de arriba (btnCamara) y un Rectangle abajo, al que añadiremos un Fill mediante un VideoBrush, para el stream de video. Es muy importante que en el manifiesto de la aplicación (WMAppManifest.xaml) del directorio Properties, contenga las capacidades ID_CAP_ISV_CAMERA y ID_CAP_MEDIALIB. En caso contrario no se podría acceder a la cámara o a la librería de medios, respectivamente.



Pivotar tablas en SQL Server

En muchas ocasiones necesitamos obtener resultados de una consulta para presentar datos agregados a partir de ella. Pensemos por ejemplo en una típica tabla de artículos y en otra de compras relacionadas con dichos artículos, indicando las unidades compradas por meses. Creamos dichas tablas y nuestro objetivo será consultar las compras realizadas por meses de esos artículos:



Ahora vamos a insertar algunos registros de ejemplo para probar luego el efecto del PIVOT:



La sentencia que nos interesa sería algo como ésto:
SELECT * FROM COMPRAS PIVOT (SUM(unidades) FOR MES IN ([201201],[201202],[201203])) pvt

Y el resultado es el esperado: agrupación por artículo, obteniendo en columnas por meses la suma de artículos comprados en dichos meses:


¿Simple, verdad?. La "magia" reside en pivotar la tabla COMPRAS, ya que queremos obtener un resultado de uno de sus campos (suma de unidades) por cada valor de otro campo de la misma tabla. Ahora las posibilidades son infinitas. Te invito a empezar a sustituir muchas de tus actuales consultas por esta forma, siempre que sea posible, que te evitará bucles, mayor codificación, etc, mejorando así el performance general.

Para terminar diremos que existe la cláusula que realiza justo la operación inversa, y se llama UNPIVOT. Una posible consulta para despivotar nuestro ejemplo, podría ser la siguiente, obteniendo un resultado sumando las compras de cada artículo agrupado por artículo y mes.

SELECT ARTICULO,MES,UNIDADES FROM
(SELECT * FROM COMPRAS PIVOT (SUM(unidades) FOR MES IN ([201201],[201202],[201203])) pvt) AS t
UNPIVOT (unidades FOR MES IN ([201201],[201202],[201203])) unpvt

Mis comienzos en la informática ...

¡Qué recuerdos!. Hoy me preguntaban mis nenes cómo empecé a esto de darle a las teclas y cuando les he mostrado una foto de mi primer ordenador han alucionado. Os lo enseño a vosotros también, un flamante Sony Hit-Bit 55 MSX. Con 16Kbs de RAM ampliables a 64Kbs mediante cartuchos. ¡Qué pasada aquellos juegos en cartucho y cómo no, en cinta de cassette, jejejeje!. La conexión al TV de mi cuarto y aquello era alucinante.


MSX, el estándard nipón por aquella época (principios de los 80´s) incluía el BASIC, con el que aprendí algunos principios básicos de la programación, ¡cuántos miles y miles de líneas escribí con él!. Era insaciable con todos los recursos (libros, revistas, etc) que aparecían. Miro hacia atrás y a veces cuando me relajo algo, recuerdo aquel "hambre" de aprender y hacer cosas nuevas. Y es que ¡30 años no son nada!. Luego ya tuve un "8088", luego un "386", aquel "Pentium 133Mhz", etc. Hoy día con procesadores Intel Core i7, tan sobrados, y con 8Gb RAM como mínimo veo en primera persona esta tremenda evolución tecnológica. Y lo mejor es que el futuro nos seguirá deparando otras aún mayores. Nos vemos.

Buscar en el Blog: