miércoles, 19 de diciembre de 2012

Programación en SQL Server



Últimamente me he dado cuenta (tristemente) que la gente no le da la importancia debida a las diferentes técnicas y herramientas de programación con las que se cuentan en SQL Server, es preocupante que los "DBA" de las empresas tengan técnicas paupérrimas para obtener la información que requieren y peor aún que piensen que es la única y mejor manera sin haber tenido contacto con literatura más avanzada del tema.

Con este conjunto de entradas no quiero ser agresivo y mucho menos engreído, el objetivo es dar una serie de consejos que puedan guiar al programador a crear las estructuras necesarias, utilizar las técnicas óptimas y proponer las tareas de análisis que hagan en conjunto una técnica de programación aceptable, no podría decir que la mejor porque al final estoy 100% seguro que su servidor no tendrá siempre la mejor respuesta, sería egocentrismo.

¿Por dónde empezar?, analicemos la sentencia SELECT y veamos muchos puntos interesantes que podemos desprender de este tema.

Es más que conocido que la sentencia SELECT es utilizada para obtener información de la base de datos y dado que tiene una sintaxis tan sencilla luego se olvidan las implicaciones que se pueden tener al escribir una sentencia de pobre análisis y peor ejecución.

Recordemos que estamos trabajando en bases de datos OLTP cuyo objetivo es establecer una infraestructura que permita la escritura rápida de datos y dar herramientas para poder realizar lecturas rápidas, pero dejaremos en claro que su objetivo es la escritura rápida.

La sentencia más básica tendría esta estructura:

SELECT * FROM Productos

"Productos" es el nombre de la tabla de la que queremos obtener la información y "*" significa que queremos obtener todas las columnas de la tabla.

¿Implicaciones?, muchas, el primer punto importante es que debemos dejar en claro que jamás deberemos obtener columnas que no vamos a utilizar, en este caso si sólo necesitamos el id, nombre, color y precio; pues sólo debemos mencionar esas columnas:

SELECT Id, Nombre, Color, Precio
FROM Productos

Una segunda implicación de utilizar el "*" en lugar de sólo las columnas que vamos a utilizar, es que de forma inequívoca se realizará un barrido al índice CLUSTERED de la tabla, es decir que se hará un barrido fila a fila de la tabla, lo cual dependiendo de la cantidad de filas puede tener consecuencias negativas.

Si no vamos a utilizar todos los productos, es imprescindible el filtrar los datos desde el manejador de base de datos, es decir que no deberemos enviar toda la información al cliente y posteriormente realizar el filtrado, todo esto gastaría recursos de forma inútil (a menos que haya razones de mucho peso para hacerlo)    La sentencia para filtrar los productos cuyo precio sea mayor a $100.00 sería la siguiente:

SELECT Id, Nombre, Color, Precio
FROM Productos
WHERE Precio > 100

Es importante notar que no siempre que exista un índice sobre las columnas que aparecen en la parte del WHERE éste va a ser utilizado:
  1. Si la cantidad de productos que cumplen con la condición es grande respecto al total de filas en la tabla, entonces el manejador ejecutará un barrido fila a fila.
  2. Si la cantidad de productos que cumplen con la condición es pequeña respecto al total de filas en la tabla, entonces el índice será utilizado.
Uno podría pensar que si son muchos, pues los regresamos todos, total así fue requerida la sentencia ¿no?, bueno, supongamos que entramos a una tienda de discos y buscamos el género "banda", ¿imaginan cuántos discos van a salir?, ¿es posible que alguien los vea todos?, generalmente no pasa así, por lo tanto es imperativo que ofrezcamos un resultado paginado para evitar que se envíen resultados que no van a ser utilizados.

En entradas posteriores estaremos trabajando más sobre la sentencia SELECT.

No hay comentarios.:

Publicar un comentario