¿Indizar vista?

04/02/2005 - 13:37 por manolo | Informe spam
Hola,

Tengo una base de datos para un programa de gestión: facturas,
albaranes, etc.

Mi cliente quiere una pantalla en la que le salgan los movimientos de
compras y ventas que han tenido por artículo.
Para ello, he creado una vista con dos consultas y una instrucción
union, cada consulta recoge los datos tanto de compras como de ventas.
El caso es que esta consulta es demasiado lenta y me he preguntado si
era aconsejable crear un índice en la vista. No he creado en mi vida una
vista de estas características indizada por lo que les pregunto a ustedes si
lo ven aconsejable o hay otra solución.

La tabla de compras en este momento tiene unos 2000 registros y la de
ventas unos 20000. La consulta de la vista dura unos 5 minutos.
Si quieren que les adjunte la consulta, díganmelo y la adjunto, ya que
es un poco grande.

Un saludo y gracias.

Preguntas similare

Leer las respuestas

#1 Salvador Ramos
04/02/2005 - 13:57 | Informe spam
Hola:

Si nos pasas la consulta y las DDL para ver las estructuras de las tablas
que intervienen, intentaremos ayudarte. Con una cantidad de datos tan
pequeña te debería devolver los datos de forma inmediata.

También te paso un link para que mires el tema de las vistas indexadas,
aunque no creo que lo necesites con tan pocos datos:
http://www.microsoft.com/spanish/ms...dviews.asp

Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)

"manolo" escribió en el mensaje
news:
Hola,

Tengo una base de datos para un programa de gestión: facturas,
albaranes, etc.

Mi cliente quiere una pantalla en la que le salgan los movimientos de
compras y ventas que han tenido por artículo.
Para ello, he creado una vista con dos consultas y una instrucción
union, cada consulta recoge los datos tanto de compras como de ventas.
El caso es que esta consulta es demasiado lenta y me he preguntado si
era aconsejable crear un índice en la vista. No he creado en mi vida una
vista de estas características indizada por lo que les pregunto a ustedes
si lo ven aconsejable o hay otra solución.

La tabla de compras en este momento tiene unos 2000 registros y la de
ventas unos 20000. La consulta de la vista dura unos 5 minutos.
Si quieren que les adjunte la consulta, díganmelo y la adjunto, ya que
es un poco grande.

Un saludo y gracias.

Respuesta Responder a este mensaje
#2 Tinoco
04/02/2005 - 14:07 | Informe spam
Hola manolo,

A mi casi no me gusta usar vistas en SQL Server, ya que los Stored
procedures me brindan mayores utilidades. Te recomendaria usar un SP, si se
puede!; y mejor adicionar indices a las tablas que utilizas en la vista.

Realizas filtrado de datos utilizando la vista? Si se utiliza en otras
consultas, se puede pensar en utilizar un indice.

Hermilson Tinoco

"manolo" wrote:

Hola,

Tengo una base de datos para un programa de gestión: facturas,
albaranes, etc.

Mi cliente quiere una pantalla en la que le salgan los movimientos de
compras y ventas que han tenido por artículo.
Para ello, he creado una vista con dos consultas y una instrucción
union, cada consulta recoge los datos tanto de compras como de ventas.
El caso es que esta consulta es demasiado lenta y me he preguntado si
era aconsejable crear un índice en la vista. No he creado en mi vida una
vista de estas características indizada por lo que les pregunto a ustedes si
lo ven aconsejable o hay otra solución.

La tabla de compras en este momento tiene unos 2000 registros y la de
ventas unos 20000. La consulta de la vista dura unos 5 minutos.
Si quieren que les adjunte la consulta, díganmelo y la adjunto, ya que
es un poco grande.

Un saludo y gracias.



Respuesta Responder a este mensaje
#3 Gustavo Larriera [MVP]
04/02/2005 - 14:19 | Informe spam
Cuando mides esa demora de 5 minutos... lo haces directamente en el
Query Analyer? O estás teniendo esa demora al acceder a través de la
aplicación?

Mi pregunta es para determinar si el problema de demora está en la
consulta misma o en realidad en la aplicación que usa la consulta.

No dices qué tipo de aplicación es la pantalla: formularios windows,
página web?

Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and
confers no rights.



"manolo" wrote in message
news::
Hola,

Tengo una base de datos para un programa de gestión: facturas,
albaranes, etc.

Mi cliente quiere una pantalla en la que le salgan los movimientos de

compras y ventas que han tenido por artículo.
Para ello, he creado una vista con dos consultas y una instrucción
union, cada consulta recoge los datos tanto de compras como de ventas.
El caso es que esta consulta es demasiado lenta y me he preguntado si

era aconsejable crear un índice en la vista. No he creado en mi vida una

vista de estas características indizada por lo que les pregunto a ustedes
si
lo ven aconsejable o hay otra solución.

La tabla de compras en este momento tiene unos 2000 registros y la de

ventas unos 20000. La consulta de la vista dura unos 5 minutos.
Si quieren que les adjunte la consulta, díganmelo y la adjunto, ya que

es un poco grande.

Un saludo y gracias.
Respuesta Responder a este mensaje
#4 manolo
04/02/2005 - 21:38 | Informe spam
Hola, gracias a todos.

Deciros que la consulta está probada en el analizador de consultas.

La consulta es:

use gestion
go
ALTER view ListaSeguimientoArticulos
as
select Articulos.Codigo as codArticulo,
rtrim(Articulos.Descripcion + ' ' + Tallas.Descripcion + ' ' +
Colores.Descripcion) as descripcion,
Articulos.cInterno,
DetallesAlbaranesVentas.Cantidad,
DetallesAlbaranesVentas.Precio,
DetallesAlbaranesVentas.Tipo,
DetallesAlbaranesVentas.Ejercicio,
coalesce(AlbaranesVentas.Cliente, FacturasVentas.Cliente,
TicketsVentas.Cliente) as Cliente,
coalesce(AlbaranesVentas.FechaAlbaran, FacturasVentas.FechaFactura,
TicketsVentas.FechaTicket) as Fecha,
convert(nvarchar(16), AlbaranesVentas.numAlbaran) as numAlbaran,
FacturasVentas.numFactura,
TicketsVentas.NumTicket,
Clientes.RazonSocial
from Articulos left join Tallas on articulos.talla = tallas.Codigo left join
colores on articulos.color = colores.codigo
inner join DetallesAlbaranesVentas on Articulos.Codigo =
DetallesAlbaranesVentas.codArticulo
left join AlbaranesVentas on DetallesAlbaranesVentas.numAlbaran =
AlbaranesVentas.numAlbaran and DetallesAlbaranesVentas.Ejercicio =
AlbaranesVentas.Ejercicio and DetallesAlbaranesVentas.Serie =
AlbaranesVentas.Serie
left join FacturasVentas on DetallesAlbaranesVentas.numFactura =
FacturasVentas.numFactura and DetallesAlbaranesVentas.EjercicioFacturas =
FacturasVentas.Ejercicio and DetallesAlbaranesVentas.Serie =
FacturasVentas.Serie
left join TicketsVentas on DetallesAlbaranesVentas.numTicket =
TicketsVentas.numTicket and DetallesAlbaranesVentas.EjercicioFacturas =
TicketsVentas.Ejercicio and DetallesAlbaranesVentas.Serie =
TicketsVentas.Serie
inner join Clientes on Clientes.Codigo = coalesce(AlbaranesVentas.Cliente,
FacturasVentas.Cliente, TicketsVentas.Cliente)
union
select Articulos.Codigo as codArticulo,
rtrim(Articulos.Descripcion + ' ' + Tallas.Descripcion + ' ' +
Colores.Descripcion) as descripcion,
Articulos.cInterno,
DetallesAlbaranesCompras.Unidades as Cantidad,
DetallesAlbaranesCompras.Precio,
0 as Tipo,
DetallesAlbaranesCompras.Ejercicio,
coalesce(AlbaranesCompras.Proveedor, FacturasCompras.Proveedor) as Cliente,
coalesce(AlbaranesCompras.FechaAlbaran, FacturasCompras.FechaFactura) as
Fecha,
AlbaranesCompras.numAlbaran,
FacturasCompras.numFactura,
null as NumTicket,
Proveedores.RazonSocial
from Articulos left join Tallas on articulos.talla = tallas.Codigo left join
colores on articulos.color = colores.codigo
inner join DetallesAlbaranesCompras on Articulos.Codigo =
DetallesAlbaranesCompras.codArticulo
left join AlbaranesCompras on DetallesAlbaranesCompras.numAlbaran =
AlbaranesCompras.numAlbaran and DetallesAlbaranesCompras.Ejercicio =
AlbaranesCompras.Ejercicio
left join FacturasCompras on DetallesAlbaranesCompras.numFactura =
FacturasCompras.numFactura and DetallesAlbaranesCompras.EjercicioFacturas =
FacturasCompras.Ejercicio
inner join Proveedores on Proveedores.Codigo =
coalesce(AlbaranesCompras.Proveedor, FacturasCompras.Proveedor)

Como veis la consulta es un poco compleja, si teneis alguna idea mejor,
hacérmelo saber, os lo agradeceré.

Un saludo.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida