FORCESEEK
obliga al optimizador de consultas a usar sólo una operación de Index Seek como
ruta de acceso a los datos de la tabla o vista a la que se hace referencia en
la consulta.
Comentaros que
el operador Index Seek utiliza la capacidad de
búsqueda de los índices para recuperar filas de un índice… Al forzar una
operación de index seek, se puede lograr un mejor rendimiento de las consultas.
FORCESEEK puede
invalidar el plan predeterminado elegido por el optimizador de consultas para
evitar problemas de rendimiento producidos por un plan de consultas ineficaz.
Por ejemplo, si
un plan usa un índice, y las tabla correspondiente a ese plan produce un número
alto de lecturas durante la ejecución de la consulta, una de las
cosas que podemos hacer, para determinar si el plan de ejecución usado por una
consulta es el adecuado, antes de la ejecución de la consulta ejecutamos:
SET
STATISTICS IO ON
Y una
vez ejecutada la consulta, gracias ha SET STATISTICS IO ON, nos devolverá una
pestaña (Messages) donde encontraremos el valor de logical
reads -> Paginas leídas. Logical
reads, ha de ser inferior al numero de registros devueltos por la consulta (un
sitio donde indica el numero de registros devuelto por la consulta, es en la
esquina inferior derecha del Management Studio)
Podemos
estar sufriendo, que las mismas consultas, según los parámetros de las variables
(para nuestro ejemplo @pid), en ocasiones tarden segundos y en otras ocasiones
tarden minutos o incluso horas… ya que el plan de ejecución que esta en memoria
para esa consulta, no es el adecuado para distintos valores/parámetros de las
variables.
Por ejemplo. La consulta:
USE AdventureWorks2008R2;
GO
SELECT *
FROM Sales.SalesOrderHeader AS
h
INNER JOIN
Sales.SalesOrderDetail AS d
ON h.SalesOrderID = d.SalesOrderID
WHERE h.TotalDue > 100
AND (d.OrderQty > 5 OR
d.LineTotal < 1000.00);
GO
Muestra que el optimizador de consultas eligió a un
operador Clustered Index Scan para tener acceso a los datos en ambas tablas.

Puede obligar al optimizador de consultas a que
realice una operación de la búsqueda en la tabla Sales.SalesOrderDetail
especificando la sugerencia FORCESEEK como se muestra en la consulta siguiente:
USE AdventureWorks2008R2;
GO
SELECT *
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d WITH (FORCESEEK)
ON h.SalesOrderID = d.SalesOrderID
WHERE h.TotalDue > 100
AND (d.OrderQty > 5 OR d.LineTotal < 1000.00);
GO
El plan de ejecución siguiente muestra los resultados
de utilizar la sugerencia FORCESEEK en la consulta. Se usa una operación de
Clusteres Index Seek para tener acceso a los datos en la tabla Sales.SalesOrderDetail.

Más información: http://msdn.microsoft.com/es-es/library/bb510478.aspx
Apunte y recopilación por Norman M. Pardell
Puedes consultarme, si deseas cualquier aclaración, pregunta o sugerencia en: Contacto, contestaré tan pronto como me sea posible.