You are on page 1of 4

Entender el Plan de Ejecucin en SQL Server 2005/2008 Grimpi IT Blog

Page 1 of 8

Grimpi IT Blog
Octubre 28, 2008
Entender el Plan de Ejecucin en SQL Server 2005/2008
Archivado en: Engine, Plan de ejecucin, SQL Server Etiquetas:Base de datos, Plan de ejecucin, SQL Server grimpi @ 11:51 pm
Cada vez que se ejecuta una consulta en un motor de bases de datos, internamente se ejecutan una serie de operaciones, que varan segn la consulta, los datos y obviamente, el motor de base de datos. El conjunto de pasos que tiene que realizar el motor para ejecutar la consulta, se llama Plan de Ejecucin. Hoy vamos a explicar cmo entender el plan de Ejecucin de SQL Server 2005/2008. Que operaciones podemos encontrar en el plan de ejecucin? Table Scan: Significa que el motor tiene que leer toda la tabla. Esto solo puede suceder cuando la tabla es Heap (o sea, no tiene un ndice clustered). En algunos casos, cuando es una tabla chica, un Table Scan es la mejor opcin, ya que produce poco overhead. De hecho la tabla puede tener ndices y sin embargo el SQL elige usar un table scan porque sera ms rpido. Pero cuando la tabla es ms grande, no debera haber Table Scan, ya que es muy costoso. Para solucionar este problema, hay ver si la tabla tiene ndices y si se estn usando correctamente. Lo importante es prestarle atencin cuando vemos un table Scan. Muchas veces, nuestro problemas de performance pasan por ah. Ejemplo:
(Creamos una tabla sin ningn tipo de ndice y se le hace una consulta)

CREATE ( Campo1 Campo2 Campo3 Campo4 Campo5 )

TABLE [TablaPrueba1] int IDENTITY (1, 1) NOT NULL , int, int, int, char (30)

SELECT * FROM TablaPrueba1

Clustered Index Scan: Esta operacin es muy similar a un table scan. El motor recorre toda la tabla. La diferencia entre uno y otro, es que el Clustered Index Scan se realiza en una tabla que tiene un ndice Clustered y el Table Scan en una tabla que no tiene este tipo de indice. Otra vez tenemos que evaluar si esta opcin es la que realmente queremos. Muchas veces, por un mal uso de los ndices, se ejecuta esta operacin, cuando en realidad queramos otra ms eficiente. Ejemplo de un Clustered Index Scan:

CREATE TABLE [TablaPrueba3] ( Campo1 int IDENTITY (1, 1) NOT NULL, Campo2 int, Campo3 int, Campo4 int, Campo5 char (30) CONSTRAINT [PK_Campo3] PRIMARY KEY CLUSTERED ( [Campo1] )) SELECT * FROM TablaPrueba3
Clustered Index Seek: Si vemos esta operacin, en general, podemos estar contentos. Significa que el motor est usando efectivamente el ndice Clustered de la tabla. Ejemplo de esta operacin:
(Usamos la tabla creada en el ejemplo anterior con un ndice Clustered, le insertamos 10000 registros para que el motor prefiriera usar el ndice antes que un scan y filtramos por el ndice).

http://grimpidev.wordpress.com/2008/10/28/entender-el-plan-de-ejecucion-en-sql-server-200520... 22/10/2009

Entender el Plan de Ejecucin en SQL Server 2005/2008 Grimpi IT Blog


SET NOCOUNT ON DECLARE @Top int SET @Top = 0 WHILE @Top <> 10000 BEGIN INSERT INTO TablaPrueba3 VALUES (convert(int,rand()*20000),convert(int,rand() *20000),convert(int,rand()*20000), P) SET @Top = @Top+1 END

Page 2 of 8

SELECT * FROM TablaPrueba3 WHERE Campo1 = 2

Index Seek: Aqu tambin si vemos esta operacin, podemos estar contentos. Es similar que el Clustered Index Seek, pero con la diferencia de que se usa un indice Non Clustered.
(Creamos un ndice Non Clustered sobre la tabla del ejemplo anterior)

CREATE INDEX [IDX_Campo3] ON [dbo].[TablaPrueba3](Campo2,Campo3) ON [PRIMARY] SELECT Campo2 FROM TablaPrueba3 WHERE Campo2 = 2 and Campo3 = 2

Index Scan: Esta operacin se ejecuta cuando se lee el ndice completo de una tabla. Es preferible a un Table Scan, ya que obviamente leer un indice es mas chico que una tabla. Esta operacin puede ser sntoma de un mal uso del ndice, aunque tambin puede ser que el motor haya seleccionado que esta es la mejor operacin. Es muy comn un Index Scan en un join o en un ORDER BY o GROUP BY. Usemos la tabla TablaPrueba3, creada en el ejemplo anterior:
(Como no hay ningn filtro, el motor debe leer toda la tabla. Sin embargo, al traer solo el Campo2, que pertenece a un ndice Non Clustered, en vez de hacer un Table Scan, es mas optimo hacer un Index Scan).

SELECT Campo2 FROM TablaPrueba3

Bookmark Lookup: Esta es una operacin muy importante, donde hay algunas diferencias entre 2000 y 2005 que vale la pena saber. El Bookmark Lookup indica que SQL Server necesita ejecutar un salto del puntero desde la pgina de ndice a la pgina de datos de la tabla para recuperar los datos. Esto sucede siempre que tenemos un ndice Non Clustered. Para evitar esta operacin, hay que limitar los campos que queremos traer en la consulta. Si el campo que vamos a extraer, esta fuera del ndice, entonces se va a ejecutar esta operacin y no queda otra opcin (para SQL Server 2000). Ac reside la importancia de evitar los SELECT * FROM Veamos el siguiente ejemplo usando nuevamente la tabla TablaPrueba3, pero con la siguiente consulta, tanto para SQL Server 2000 y SQL Server 2005: Ejemplo: (Se trae todos los campos de la tabla, filtrando por un campo perteneciente a un ndice non clustered).

SELECT Campo2, Campo3, Campo4 FROM TablaPrueba3 WHERE Campo2 = 2


SQL Server 2000:

http://grimpidev.wordpress.com/2008/10/28/entender-el-plan-de-ejecucion-en-sql-server-200520... 22/10/2009

Entender el Plan de Ejecucin en SQL Server 2005/2008 Grimpi IT Blog


SQL Server 2005:

Page 3 of 8

Si vemos el plan de ejecucin (de SQL Server 2000), se realiz la operacin Index Seek, pero adems, aparece la operacin Bookmark Lookup. Esto pasa porque en este ejemplo adems de traer el campo2 y campo3 que son parte del ndice, debe leer el campo5, que solo est en la pgina de datos y no en el ndice. Ademas, como podemos ver, la misma consulta, para exactamente la misma tabla con los mismos datos e ndices, pareciera generar un plan de ejecucin diferente en SQL Server 2000 y SQL Server 2005. Pero sin embargo, no es as. Dado que dentro de la estructura interna de un ndice non clustered, se almacena un puntero al ndice clustered, el boorkmark lookup internamente se traduce como un salto a la lectura del ndice clustered de la tabla. Para entender mejor este punto, recomiendo leer este post que escrib hace un tiempo. En SQL Server 2000 toda esta operacin es encapsulada en un solo icono al mostrar graficamente el plan, mientras que en SQL Server 2005, el plan de ejecucin est ms detallado. Pero la real diferencia entre ambas versiones (2000 y 2005) no es una simple cuestin esttica. Una de las ms interesantes nuevas caractersticas de SQL Server 2005, es la posibilidad de incorporar en la pagina final del ndice (donde residen los valores), campos de la tabla que son externos al ndice. Que significa que externo al ndice? Significa que el campo no es parte de la estructura del ndice, que no va a ser utilizado por el motor a la hora de filtrar y buscar, pero sin embargo, su contenido est copiado a la estructura de la ltima pgina del ndice. La ventaja de esto, es que le ahorra al motor del SQL, hacer el boorkmark lookup, operacin bastante costosa. La desventaja, es que al hacer ms grande el ndice, entran menos registros por pgina, lo cual podra llevar a que se tengan que hacer mas operaciones de I/O. Por lo tanto, es necesario hacer una evaluacin de costo/beneficio, antes de incluir campos adicionales al ndice. Joins: Un join es la relacin entre 2 tablas. SQL tiene tres tipos de joins. Neested Loop Join, Merge Join y Hash Join. Dependiendo de las caractersticas de la consulta y de la cantidad de registros, el motor puede decidir uno u otro. Ninguno es peor o mejor per se. Todo depende de las caractersticas de la consulta y del volumen de datos.

Neested Loop Join: Suele ser generalmente el ms frecuente. Es tambin el algoritmo ms simple de todo. Este operador fisico es usado por el motor cuando tenemos un join entre 2 tablas y la cantidad de registros es relativamente baja. Tambien aplica con cierto tipo de joins (cross joins por ejemplo). Merge Join: Otro de los tipos de join que existen. Generalmente se usa cuando las cantidades de registros a comparar son relativamente grandes y estn ordenadas. Aun si no estn ordenadas, el motor puede predecir que es ms rpido ordenar la tabla y hacer el merge join que hacer un Neested Loop Join. En muchas situaciones es frecuente ver que una consulta anteriormente usaba Neested Loop Join y en algn momento paso a usar un Merge Join. La razn de esto, es porque el volumen de datos aumento y por lo tanto, es mas optimo usar un Merge join. Hash Join: Otro tipo ms de join que existe. Mientras que los Loop Joins trabajan bien para conjuntos chicos de datos y los merge join para conjuntos moderados de datos, el hash join es especialmente til en grandes conjuntos de datos, generalmente en datawarehouses. Este operador es mucho mas paralelizable y escalable. Tambin se usa generalmente cuando las tablas relacionadas no tienen ndice en ninguna de los campos a comparar. Hay que prestar atencin si vemos este tipo de operaciones, ya que puede significar un mal uso de los ndices. Sin embargo, los hash joins consumen mucha memoria y SQL Server tiene un lmite en la cantidad de operaciones de este tipo que puede efectuar simultneamente. Existen varios subtipos de hash joins. El que quiere ver en detalle esto, en este link hay una excelente explicacin (http://blogs.msdn.com/craigfr/archive/2006/08/10/687630.aspx).

Ejemplo:
(Se va a ejecutar exactamente la misma consulta con una tabla con 50 registros y con 2000 registros, para ver cmo cambia en funcin del volumen de datos, el tipo de operacin)

SELECT T1.* FROM tablaprueba3 T1 INNER JOIN TablaPrueba3 T2 ON T2.Campo4 = T1.Campo1


Consulta con 50 registros en la tabla

Consulta con 20000 registros en la tabla

http://grimpidev.wordpress.com/2008/10/28/entender-el-plan-de-ejecucion-en-sql-server-200520... 22/10/2009

Entender el Plan de Ejecucin en SQL Server 2005/2008 Grimpi IT Blog

Page 4 of 8

Agregaciones: Las agregaciones refieren a agrupar un conjunto grande de datos en un conjunto de datos ms chico.

Stream Aggregate: Este tipo de operaciones ocurre cuando hay se llama a un funcin de agregacin, como MIN, COUNT, MAX, SUM, etc. El operador Stream Aggregate requiere que la informacin est ordenada por las columnas dentro de sus grupos. Primero, el optimizador ordenar si los datos no estn ordenados por un operador Sort anterior. En cierta manera, el Stream Aggregate es similar al Merge Join, en cuanto a en que situaciones se produce. Hash Match (Aggregate): Hay que tener cuidado cuando vemos este operador. Esta operacin tambin ocurre cuando se llama a funciones de agregacin del tipo MIN, COUNT, AVG, etc. As como el Stream Aggregate es comparable al Merge Join, el Hash Match Aggregate es similar al Hash Join. Lo que hace internamente es armar una tabla de hash. En situaciones donde la cantidad de registros es elevada o no se estn indexadas las columnas por las cuales agrupa la consulta, el motor del SQL va a elegir esta operacin.

Ejemplo:

SELECT MAX(Campo2) FROM TablaPrueba3 GROUP BY Campo2

SELECT MAX(Campo4) FROM TablaPrueba3 GROUP BY Campo4

Como podemos observar en este ejemplo, las 2 consultas son prcticamente similares en estructura, solo que el primer caso agrupa el campo2 que esta indexado y en el segundo caso, agrupa el campo4, que no est indexado y por eso usa el operador Hash Match. Sort: Otro punto para observar, es cuando vemos un sort. Como el nombre lo indica, esta operacin ordena. Ahora, el Sort solo se hace cuando el campo o los campos que se desean ordenar, no estn indexados. A veces esta operacin se ejecuta sola, sin que nosotros hayamos puesto en la consulta el ORDER BY, porque el motor necesita ordenar los datos por alguna razn, por ejemplo, para ejecutar un Merge Join. Pero recordemos que si ordenamos por un campo indexado y este indice esta siendo utilizado, no se ejecuta esta operacin. Ejemplo de esta operacin:

SELECT * FROM TablaPrueba3 ORDER BY Campo3

Ads by Google

Cursos de SQL Server


Preprate para trabajar o mejorar tu trabajo. Presenciales y online. Cursos.SQL.Server.Lectiva.net

Grados IE University
Infrmate de nuestras Titulaciones Un entorno privilegiado e innovador www.ie.edu/university

http://grimpidev.wordpress.com/2008/10/28/entender-el-plan-de-ejecucion-en-sql-server-200520... 22/10/2009

You might also like