Diario de SQL Server

Nuevos foros de SSIS y SSAS en Español

Escrito por qwalgrande 26-10-2010 en General. Comentarios (0)

Hace algunas semanas se crearon dos nuevos foros en MSDN en Español:

 

    - Integration Services (http://social.msdn.microsoft.com/Forums/es-ES/ssises/threads).

    - Analysis Services (http://social.msdn.microsoft.com/Forums/es-ES/ssases/threads).

 

 

 

Puede ser una buena idea para enfocar las preguntas de esos temas, que cada vez están teniendo más y más peso. Desde aquí os invito a participar en ellos. Estaré por allí con la frecuencia que me sea posible.

 

Examinando un plan de ejecución

Escrito por qwalgrande 10-10-2010 en General. Comentarios (0)

En el foro, a Titojarocho le surgió un problema de running totals.

 

http://social.technet.microsoft.com/Forums/es-ES/sqlserveres/thread/d373d031-feae-4402-99d1-ff89f27391a4

 

El caso lo pudo resolver, pero quería saber si el plan de ejecución de lo obtenido era adecuado. Para poder examinarlo, me envió el plan de ejecución, ya que pegarlo en un post era muy complicado, por su tamaño. Dejo aquí la conversación que mantuvimos por mail para conocimiento del resto de usuarios del foro, incluyendo fotos de los planes de ejecución que él me envió en formato xml, salvado como .sqlplan.

 

Hola Alberto

 

Te paso el archivo del plan en xml.
 
Necesitas que te pase la imagen?
 
Saludos cordiales,

 

<Titojarocho>

 

http://qwalgrande.blogspot.es/img/Titojarocho1.gif 

 

Hola.

 

Lo que puedo decirte es que crees el índice que te sugiere el optimizador y vuelvas a pasarme el plan, indicándome también la diferencia de rendimiento que experimentes.

 

USE [DESARROLLO]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [Ventas].[P_VTASACUMXDIAVEND] ([Compania],[Fecha])
INCLUDE ([Sucursal],[Canal],[VentaDia])
GO

 

Alberto López Grande.

 


Hola Alberto, te envío el plan de ejecución el tiempo de respuesta es igual, nada más que en vez de scanear el índice agrupado ahora scanea por el índice creado.
 
Una pregunta cómo puedo determinar cuando un query necesita un índice en sql Server? Tienes algo de literatura para checar más afondo sobre este tema.
 
Te agradezco tu tiempo.
 
Saludos cordiales,

 

<Titojarocho>

 

http://qwalgrande.blogspot.es/img/Titojarocho2.gif  

 

 

Hola.

 

El actual plan es bastante mejor que el otro. Puede que rinda más o menos igual, pero el número de lecturas seguramente sea inferior.

 

Sobre cómo saber cuándo una consulta puede mejorarse con un índice, hay varias formas, pero quizá la más simple es con el plan de ejecución en modo gráfico. Si abres el primero de los ficheros que me mandaste con Management Studio, verás que aparece un texto en verde en la cabecera, es una sugerencia para la creación de índices. Si le pulsas botón derecho y le das a "Missing Index Details", te prepara la consulta de creación del índice y todo.

 

Pero quizá sea más útil crear los índices basándote en su uso. Puede que una ejecución no justifique la creación del índice, pero muchas sí. Escribí en mi blog hace poco sobre ello:

 

http://qwalgrande.blogspot.es/1284932940/crear-los-indices-que-se-necesitan...-(1/2)/

 

Ahora sólo nos queda informa de ello en el foro para que sea útil a mucha más gente. A ver si tengo un rato y lo preparo.

 

Alberto.

 

... y eliminar los índices que no se usan (2/2)

Escrito por qwalgrande 08-10-2010 en General. Comentarios (0)

Si en el anterior post hablábamos de la cómo crear los índices que se necesitan (http://qwalgrande.blogspot.es/1284932940/crear-los-indices-que-se-necesitan...-(1/2)/), aquí hablamos de lo contrario. Si no se usa un índice, lo mejor es eliminarlo.

 

Antes de SQL Server 2005, se tenía el miedo de eliminar un índice porque era complejo determinar cuándo un índice no se usaba. Sin embargo, de SQL Server 2005 en adelante, conservar un índice que no se va a usar carece de todo sentido, porque tenemos forma de saber si se usan o no. Para ello, se puede emplear un script similar a este:


select

  object_name(i.id) as Tabla,

  case i.indid

    when 0 then N'HEAP'

    else i.name

  end as Indice,

  i.Indid,

  i.rowcnt,

  i.dpages * 8/(1024.0) as Tamaño,

  i.*--i.type_desc as Tipo

  ,u.*

  , 'drop index [' + object_name(i.id) + '].[' +

  case i.indid when 0 then N'HEAP' else i.name end +']' as Borrado

from

  sysindexes i with(nolock) inner join

  sys.objects o with(nolock) on i.id = o.object_id left join

  sys.dm_db_index_usage_stats u with(nolock) 

     on i.id = u.object_id and i.indid = u.index_id and u.database_id = db_id()

where 

  o.type = 'u' and i.status & 64 = 0 and i.indid > 1 and

  --u.object_id is null --and i.type_desc = 'NONCLUSTERED'

  (u.user_seeks = 0 and u.user_scans = 0 or u.object_id is null)

order by i.dpages desc, Tabla, i.Indid

 

Y eso es todo, no se usa, se borra, para lo cual puede hacerse uso directamente de la última columna de la sentencia.