Blog gratis
Reportar
Editar
¡Crea tu blog!
Compartir
¡Sorpréndeme!
img
img

 

 

SQL Server
Blog. (Apuntes y Recopilaciones) por Norman M. Pardell

img
img
05 de Octubre, 2011 · Query-Optimizer-FORCESEEK

Query Optimizer, usando FORCESEEK. Tema VIII

 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.



publicado por normanmpardell a las 05:31 · Sin comentarios  ·  Recomendar
Comentarios (0) ·  Enviar comentario
Esta entrada no admite comentarios.
img
.Sobre mí
FOTO

Norman M. Pardell

MCITP: Database Administrator & Database Developer, SQL Server 2008. MCC Award Certificate. Consultor Senior de bases de datos en Capgemini España, S.L. Asesoramiento en implementación, desarrollo y gestión de bases de datos en grandes compañías. Actualmente, asignado a proyecto en compañía líder en el sector energético global. Más de 10 años trabajando con SQL Server (y otros gestores de BBDD)

» Ver perfil

img
.Secciones
» Inicio
img
.Enlaces
» Microsoft MSDN Foros
» Windows Server 2012
img
.Más leídos
» Asignar la cantidad correcta de Memoria para SQL Server
» Base de Datos Sospechosa (Suspect)
» Como modificar la Intercalación (Collation) en SQL Server
» Como renombrar una instancia de SQL Server. sp_dropserver. sp_addserver
» Detectar bloqueos. SQL Server V.2005 y superiores
» Funciones SQL Server. Funciones escalares y funciones con valores de tabla.
» Integridad y corrupción en las bases de datos: DBCC CHECKDB
» Log de transacciones ( .ldf ). SQL Server.
» Migrando SQL Server 2005, 2008, 2008 R2 a SQL Server 2012
» Transacciones activas. SQL server 2008
img
.Nube de tags [?]
                                                           
img img
FULLServices Network | Crear blog | Privacidad