Como es común con el software, el problema del almacenamiento en caché de SQL es más sutil de lo que parece. Por ejemplo, veamos el almacenamiento en caché de un ad-hoc de SQL consulta:
-- First, clear the cache
DBCC FREEPROCCACHE
-- Look at what executable plans are in cache
SELECT sc.*
FROM master.dbo.syscacheobjects AS sc
WHERE sc.cacheobjtype = 'Executable Plan'
-- Execute the following statement
SELECT t.*
FROM pubs.dbo.titles AS t
WHERE t.price = 19.99
-- Look at what executable plans are in cache and you'll
-- find that there's a plan for a NUMERIC(4,2)
SELECT sc.*
FROM master.dbo.syscacheobjects AS sc
WHERE sc.cacheobjtype = 'Executable Plan'
-- If you execute the EXACT same statement with a 4,2
-- then you will get THAT plan. But if you execute with a 5,2
-- then you'll get a new plan. Try this:
SELECT t.*
FROM pubs.dbo.titles AS t
WHERE price = 199.99
-- Look again at the cached executable plans, and you'll see a NEW one...
SELECT sc.*
FROM master.dbo.syscacheobjects AS sc
WHERE sc.cacheobjtype = 'Executable Plan'
sin embargo se puede utilizar sp_executesql para escribir los parámetros y forzar el plan para ser almacenado en caché. Todos los usos posteriores tendrán el mismo plan, pero algunas personas no les gusta la oscuridad de este enfoque:
DECLARE @ExecStr nvarchar(4000)
SELECT @ExecStr = N'SELECT t.* FROM dbo.titles AS t WHERE t.price = @price'
EXEC sp_executesql @ExecStr, N'@price money', 19.99
Ahora bien, si se crea una consulta similar a un procedimiento de almacenado con un parámetro para el precio, el plan se creará y almacenará en caché en la memoria (no en el disco) en la primera ejecución, y se reutilizará independientemente del valor del parámetro.
El hecho de que el plan de procedimiento almacenado esté almacenado en la memoria y no en el disco significa que se saldrá de la memoria caché en un reinicio del servidor o debido a una baja reutilización. También puede caerse de la memoria caché si los datos de los que depende el procedimiento cambian lo suficiente como para invalidar las estadísticas. Esto hace que SQL Server invalide el plan.
Eso alivia mucha presión en realidad, gracias. Creo que, en general, todavía quiero saber si hay alguna diferencia y cuál es la diferencia (documentada), pero esta es una gran filosofía .... Me pregunto si mi equipo buscará eso :-P –
Estoy de acuerdo con usted, sin embargo, sobre la naturaleza religiosa de la pregunta, y casi no la pregunté. Pero creo que, como buenos programadores, debemos comprender exactamente qué está pasando con cada componente del sistema en caso de que necesitemos un rendimiento extremo. –
Buena respuesta. Pero es mejor comprender los detalles sangrientos para que puedas justificar la ruta que elijas. Vea mi respuesta para algunos de esos detalles. – RoadWarrior