Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/01/2008, 14:49
Avatar de Myakire
Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años
Puntos: 146
Duda al crear los índices correctos a fin de optimizar

Bueno, agradezco de antemano a quien me colabore en este tema. Me ha tocado tener que optimizar algunas consultas que se tardan demasiado e investigando considero que puede ayudarme mucho el crear algún tipo de índice (no estoy seguro aún cual es que mejor se acomode a mi problema). Tengo el SQL Server 2005 WorkGroup y no tiene el Data Engine Tuning Advisor.

Les explico la situación:

Tengo esta vista:

Código:
SELECT     ro.IDPlanta, gr.CodigoCliente AS Grupo, ro.IDMolino, c.CodigoCliente AS Cliente, ro.IDRollo, ro.NoMaster, ro.NoCase, ro.NoInspeccion, 
                      ro.NoProcesador, ro.NoParte, ro.Revision, ro.IDEspecificacion AS Spec, ro.Dimension, ro.Peso, CONVERT(varchar, ro.Posicion) 
                      + '/' + CONVERT(varchar, ro.Cortes) AS Corte, ro.FechaRecepcion, ro.FechaCorte, ro.FechaEntrega, CONVERT(varchar, re.NoRemision) AS NoRemision, 
                      ro.Barco, ro.NoViaje, ro.NoFacturaCompra, ro.CostoMXP, ro.CostoUSD, CAST(re.NoFacturaVenta AS varchar) AS NoFacturaVenta, ro.Espesor, ro.Ancho, 
                      ro.Largo, ro.Proceso, ro.IDCliente, ro.RolloPadre, ro.IDMaterial, rd.IDUsuario, rd.TimeStamp, ro.Pedimento, ro.FechaPedimento, ro.Fraccion, ro.Piezas, 
                      re.IDConsignatario, co.NombreCorto AS NombreConsignatario, re.Tipo, op.Nombre AS Operador, re.Observaciones, ro.IDProveedor, ro.CostoFactura, 
                      ro.FechaFacturaCompra, ro.Lote
FROM         dbo.RollosEmbarque AS ro INNER JOIN
                      dbo.Clientes AS c ON ro.IDCliente = c.IDCliente INNER JOIN
                      dbo.Clientes AS gr ON c.IDGrupo = gr.IDCliente INNER JOIN
                      dbo.RemisionesDetalle AS rd ON ro.IDRollo = rd.IDRollo INNER JOIN
                      dbo.Remisiones AS re ON re.NoRemision = rd.NoRemision LEFT OUTER JOIN
                      dbo.Consignatarios AS co ON re.IDConsignatario = co.IDConsignatario LEFT OUTER JOIN
                      dbo.Operadores AS op ON re.IDOperador = op.IDOperador
WHERE     (re.Estatus = 'C') AND (ro.IDPlanta NOT IN ('APRAMOS', 'APSLP', 'LAGERMEX-PUE', 'LAGERMEX-SAL')) AND (YEAR(re.Fecha) IN (2007, 2008))
UNION ALL
SELECT     s.IDPlanta, gr.CodigoCliente AS Grupo, ro.IDMolino, c.CodigoCliente AS Cliente, ro.IDRollo, ro.NoMaster, ro.NoCase, ro.NoInspeccion, ro.NoProcesador, 
                      ro.NoParte, ro.Revision, ro.IDEspecificacion AS Spec, ro.Dimension, ro.Peso, CONVERT(varchar, ro.Posicion) + '/' + CONVERT(varchar, ro.Cortes) 
                      AS Corte, ro.FechaRecepcion, ro.FechaCorte, s.Fecha AS FechaEntrega, s.Referencia AS NoRemision, ro.Barco, ro.NoViaje, ro.NoFacturaCompra, 
                      ro.CostoMXP, ro.CostoUSD, ro.NoFacturaVenta, ro.Espesor, ro.Ancho, ro.Largo, 0 AS Proceso, s.IDCliente, ro.RolloPadre, ro.IDMaterial, s.IDUsuario, 
                      s.TimeStamp, '' AS Pedimento, NULL AS FechaPedimento, '' AS Fraccion, ro.Piezas, 0 AS IDConsignatario, (CASE WHEN (s.Referencia LIKE 'TP%') 
                      THEN 'ACERO PRIME RAMOS' ELSE '' END) AS NombreConsignatario, (CASE WHEN s.Referencia LIKE 'TP%' THEN 'T' ELSE 'V' END) AS Tipo, 
                      'EDI' AS Operador, '' AS Observaciones, ro.IDProveedor, ro.CostoFactura, ro.FechaFacturaCompra, ro.Lote
FROM         dbo.Salidas AS s INNER JOIN
                      dbo.RollosEmbarque AS ro ON s.IDRollo = ro.IDRollo INNER JOIN
                      dbo.Clientes AS c ON s.IDCliente = c.IDCliente INNER JOIN
                      dbo.Clientes AS gr ON c.IDGrupo = gr.IDCliente
WHERE     (s.Referencia NOT LIKE 'T[AM]%') AND (s.IDPlanta IN ('APRAMOS', 'APSLP', 'LAGERMEX-PUE', 'LAGERMEX-SAL'))
Los mensajes que regresa al colocar set statistics io on es:
Código:
(115729 filas afectadas)
Tabla 'Worktable'. Recuento de exploraciones 0, lecturas lógicas 0, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.
Tabla 'Salidas'. Recuento de exploraciones 1, lecturas lógicas 2595, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.
Tabla 'RollosEmbarque'. Recuento de exploraciones 2, lecturas lógicas 50470, lecturas físicas 0, lecturas anticipadas 1, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.
Tabla 'Clientes'. Recuento de exploraciones 4, lecturas lógicas 32, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.
Tabla 'RemisionesDetalle'. Recuento de exploraciones 1, lecturas lógicas 2071, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.
Tabla 'Remisiones'. Recuento de exploraciones 1, lecturas lógicas 283, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.
Tabla 'Consignatarios'. Recuento de exploraciones 1, lecturas lógicas 5, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.
Tabla 'Operadores'. Recuento de exploraciones 1, lecturas lógicas 2, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.
Por lo cual supongo debo de agregar un índice cubierto, pero no estoy seguro sobre que campos.

Las estructuras de las tablas con más lecturas son:

Salidas
Cita:
Key->IDRollo varchar(11) Unchecked
Key->IDPlanta varchar(50) Unchecked
Key->Fecha datetime Unchecked
Key->IDCliente smallint Unchecked
Key-> Referencia varchar(50) Unchecked
IDUsuario smallint Unchecked
TimeStamp datetime Unchecked
RollosEmbarque
Cita:
Key-> IDRollo varchar(20) Unchecked
Estatus char(1) Unchecked
IDCliente smallint Unchecked
IDPropietario smallint Checked
IDProveedor varchar(50) Checked
IDMolino varchar(50) Unchecked
IDPlanta varchar(50) Unchecked
..... y como 20 campos mas
RemisionesDetalle
Cita:
Key-> NoRemision int Unchecked
Key-> IDRollo varchar(11) Unchecked
NoParte varchar(50) Checked
Revision smallint Checked
Partida smallint Checked
IDUsuario smallint Unchecked
TimeStamp datetime Unchecked
Aprovechando, también leyendo, encontré que podría hacer un índice sobre la vista en cuestión cuando se consulta muchas veces, y aunque esto no sea el camino que tomaré (por que un par de las tablas que tiene esa vista se actualizan muy constantemente y al parecer en este caso hacer esto sería contraproducente) me extraña el hecho de que marca error al hacerlo:

CREATE unique clustered INDEX clidx_vw_Entregas ON Entregas(IdCliente, IdGrupo, IdRollo);

Error: No se puede crear índice en la vista 'Entregas' porque la vista no está enlazada a ningún esquema.


Espero puedan ayudarme a entender esta teoría, gracias