Uno de mis compañeros de trabajo nombró un procedimiento almacenado en nuestra base de datos SQL Server 2008 R2 sp_something
. Cuando vi esto, inmediatamente pensé: "¡Eso está MAL!" y comencé a buscar en mis marcadores este artículo en línea que explica por qué está mal, para que yo pueda darle una explicación a mi compañero de trabajo.
En el artículo (por Brian Moran ) se explica que al dar al procedimiento almacenado un prefijo sp_, SQL Server busca en la base de datos maestra un plan compilado. Debido a que el sp_sproc
no reside allí, SQL Server volverá a compilar el procedimiento (y necesita un bloqueo de compilación exclusivo para eso, causando problemas de rendimiento).
El siguiente ejemplo se da en el artículo para mostrar la diferencia entre dos procedimientos:
USE tempdb;
GO
CREATE PROCEDURE dbo.Select1 AS SELECT 1;
GO
CREATE PROCEDURE dbo.sp_Select1 AS SELECT 1;
GO
EXEC dbo.sp_Select1;
GO
EXEC dbo.Select1;
GO
Ejecuta esto, luego abre Profiler (agrega los procedimientos almacenados -> SP:CacheMiss
evento) y ejecuta los procedimientos almacenados nuevamente. Se supone que ve una diferencia entre los dos procedimientos almacenados: el sp_Select1
procedimiento almacenado generará un SP:CacheMiss
evento más que el Select1
procedimiento almacenado (el artículo hace referencia a SQL Server 7.0 y SQL Server 2000 ).
Cuando ejecuto el ejemplo en mi entorno SQL Server 2008 R2, obtengo la misma cantidad de SP:CacheMiss
eventos para ambos procedimientos (tanto en tempdb como en otra base de datos de prueba).
Entonces me pregunto:
- ¿Puedo haber hecho algo mal en mi ejecución del ejemplo?
¿sproc sp_something
Sigue siendo válido el adagio " no nombrar a un usuario " en las versiones más recientes de SQL Server?- Si es así, ¿hay algún buen ejemplo que muestre su validez en SQL Server 2008 R2?
Muchas gracias por tus pensamientos sobre esto!
EDITAR
Encontré la creación de procedimientos almacenados (motor de base de datos) en msdn para SQL Server 2008 R2, que responde a mi segunda pregunta:
Recomendamos que no cree ningún procedimiento almacenado utilizando sp_ como prefijo. SQL Server usa el prefijo sp_ para designar procedimientos almacenados del sistema. El nombre que elija puede entrar en conflicto con algún procedimiento futuro del sistema. [...]
Sin embargo, no se menciona nada sobre los problemas de rendimiento causados por el uso del sp_
prefijo. Me encantaría saber si ese es el caso o si lo arreglaron después de SQL Server 2000.
sp_
? Esto es tan útil como prefijar una tabla con tbl
. ¿Por qué primero hacer que el sistema busque maestro (incluso si es insignificante o no tiene una diferencia de rendimiento) para permitirle usar esta convención de nomenclatura sin sentido?
dbo.sp_Author_Rename
es mejor que dbo.Author_Rename
. No puedo pensar en una sola cosa que tenga sentido.
sp_
versiones (es necesario verificar en las bases de datos maestra y de usuario porque prioriza los procesos del sistema enmaster
-> procesos en la base de datos de usuario -> no sistema procs inmaster
)