Te presento mi nuevo sitio web: "El Futuro de los Datos"

Aunque SQL Server Si!, seguirá activo, iré bajando la frecuencia de publicación.
Si quieres conocer todas las novedades que vaya publicando, te recomiendo que lo visites y te suscribas. Tengo un regalito para mi audiencia:

Tu primer Dashboard en "piloto automático" listo en 30 minutos
Sólo para suscriptores.
.

29 mar. 2008

Piensa en conjuntos de datos, no en filas individuales

Desde hace tiempo venimos escuchando que los cursores tienen un rendimiento pésimo en SQL Server, y cosas por el estilo. Todo eso es totalmente cierto. Incluso hay una mítica brigada anti-cursores, cuyo comandante jefe es el amigo Miguel Egea. Su lema es "Salva a SQL Server, mata un cursor" :-)

También hay un falso rumor por ahí extendido, y es que en Oracle y otros gestores de bases de datos relacionales si que se obtiene un rendimiento óptimo con su uso. Con respecto a esto quiero aclarar que, si bien es cierto que no llegan a afectar tanto al rendimiento del servidor como en SQL Server, si no los utilizamos podremos mejorar el rendimiento. Ahora el problema principal es que su uso nos facilita enormemente nuestro trabajo, así que optamos por usarlos, ya que hacen más sencillo nuestro trabajo. El que esté muy extendido su uso no justifica que tengan un buen rendimiento.

Por qué tienen tan pésimo rendimiento los cursores ? pues precisamente, porque están orientados al procesamiento fila a fila, no al procesamiento de conjuntos de filas, y las bases de datos relacionales están orientadas a conjuntos por definición. Entonces si eliminamos un cursor, mejoraremos el rendimiento ? Pues depende, no siempre la respuesta es si. Mejoraremos el rendimiento si optamos por una alternativa que sea orientada a conjuntos y no a filas. Por ejemplo, en un caso  en el que eliminemos un cursor, pero sigamos pensando en filas y montemos un bucle WHILE en el que vayamos haciendo SELECT de filas individuales y por cada una de ellas realizando las operaciones que necesitemos, poco o nada estamos haciendo, el rendimiento será prácticamente el mismo (no sabría decir cual de ellos tiene mejor rendimiento). Pero si por el contrario logramos sustituir el cursor por instrucciones orientadas a conjuntos que consigan el resultado que necesitamos (cosa posible en la mayoría de los casos) casi con total seguridad estaremos mejorando bastante el rendimiento.

Esto tampoco quiere decir que nunca utilicemos un cursor, los cursores están ahí y nos dan una funcionalidad importante, lo que debemos hacer es evitar su uso innecesario, aunque tengamos que pensar un poco más en cómo resolver la situación. Evidentemente, habrá casos en los que no encontremos otra solución, en esos los utilizaremos, que no pasa nada, lo que debemos evitar es abusar de ellos por comodidad.

A donde quiero llegar ? pues a haceros una recomendación muy importante para todos aquellos que utilizáis SQL Server, y es que, si aún no lo habéis hecho, comencéis cuanto antes a "cambiar el chip", y penséis en conjuntos, nunca en filas individuales.

Pd. Por cierto, y también estoy en la brigada anti-cursores :-P

2 comentarios:

frasevi dijo...

UN EJEMPLO DE PROCESAMIENTO EN CONJUNTO Y NO EN FILAS...

Salvador Ramos dijo...

Hola,

En los foros de SQL Server puedes encontrar multitud de ejemplos, busca allí el término cursor y aparecerán bastantes casos de eliminación de cursores, todos ellos son ejemplos de lo que pides:
http://social.msdn.microsoft.com/Forums/en-US/sqlserveres/threads

Te paso también alguno concreto localizado en la búsqueda anterior:
http://social.msdn.microsoft.com/Forums/es-HN/sqlserveres/thread/69480983-5a41-40d4-8ab7-2f8e50985d9a
http://social.msdn.microsoft.com/Forums/es-ES/sqlserveres/thread/e6a280c1-b0b0-46d0-a101-aac62082a5a9

Google