Lilypie Primer PicLilypie Primer Ticker

martes, 13 de marzo de 2007

El prefijo sp_: Usar o no usar... esa es la cuestión

Dando un vistazo a los procedimientos almacenados que incorpora SQL Server, nos damos cuenta que sus nombres siguen una misma convención: Todos empiezan con 'sp_', asi tenemos sp_configure, sp_tables sp_columns, sp_help, sp_who, etc.

Nuestro primer instinto nos sugiere que 'sp' significa 'Stored Procedure', por tanto pensamos que lo mejor que podemos hacer es seguir la misma convención y comenzamos a crear procedimientos almacenados con nombres como sp_factura_insert, sp_empleado_delete, sp_salario_select, etc.

A primera vista parece que todo funciona adecuadamente, creamos los procedimientos, los ejecutamos sin problemas y obtenemos los resultados esperados.

Ahora.. la cruda realidad: Usar el prefijo sp_ para nombrar nuestros procedimientos almacenados NO es la mejor idea.

La razón es muy simple: SQL Server reconoce el prefijo sp_ como 'System Stored Procedure', es decir, un procedimiento almacenado de Sistema.

Esa caracter'istica influye en la estrategia que SQL Server utiliza para localizar el SP cuando intentamos ejecutarlo. Por ejemplo, si lanzamos una instrucción exec sp_persona_delete, SQL Server asume que se trata de un procedimiento almacenado de sistema, y por tanto debe encontrarse en la Base de Datos MASTER, donde residen todos los demás procedimientos almacenados de este tipo. Entonces primeramente intenta localizar el procedimiento en la BD Master. Al no encontrarlo, recién intenta encontrarlo en la BD activa.

Y cuales son las consecuencias de este comportamiento?: Una caída en el rendimiento. No parece influir mucho cuando la carga de transacciones es pequeña, pero cuando nuestro servidor debe atender miles de transacciones por minuto, entonces se notará una gran caída en el desempeño.

Otro punto a tomar en cuenta es que si creamos un procedimiento almacenado con el mismo nombre que un procedimiento almacenado de sistema, entonces nuestro procedimiento almacenado no se ejecutará nunca. Siempre será invocado el SP de sistema.

Por ejemplo, si creamos un SP llamado sp_who en la BD tempdb

USE tempdb
GO
CREATE PROCEDURE SP_WHO
AS
SELECT 'HOLA'
GO


ahora intentamos ejecutarlo

USE tempdb
GO
EXEC sp_who
EXEC dbo.sp_who
EXEC tempdb.dbo.sp_who
GO


Vemos que en todos los casos se ejecuta el SP de sistema. Aún cuando intentamos ejecutar nuestro SP con su nombre totalmente cualificado.


La única forma de ejecutar nuestro SP en lugar del SP de sistema es creándolo bajo un schema diferente a dbo, así:

USE tempdb
GO
CREATE SCHEMA mySchema AUTHORIZATION dbo
GO
CREATE PROCEDURE mySchema.SP_WHO
AS
SELECT 'HOLA'
GO
EXEC mySchema.sp_who
GO


Demasiadas complicaciones para obtener un simple Hola.


Moraleja: Jamás usar el prefijo 'sp_' en los nombres de nuestros procedimientos almacenados.

1 comentario:

Ing. Georchs dijo...

Ésta es de esas informaciones que son poco conocidas pero que pueden hacer una diferencia fundamental en el diseño de tu BD. Muchas gracias por tu esfuerzo!