aumentar rapidez en una select

03/06/2004 - 13:34 por reo | Informe spam
tengo el select:

select da1.campo4,da1.campo5,a1.campo1,c.campo2,d.campo2
from da1,a1,c,d
where da1.campo1=a1.campo1 and da1.campo2='555' and c.campo1=a1.campo2 and
d.campo1=a1.campo3
union all
select df1.campo4,df1.campo5,f1.campo1,c.campo2,d.campo2
from df1,f1,c,d
where df1.campo1=f1.campo1 and df1.campo2='555' and c.campo1=f1.campo2 and
d.campo1=f1.campo3
union all
select do1.campo4,do1.campo5,o1.campo1,c.campo2,d.campo2
from do1,o1,c,d
where da1.campo1=o1.campo1 and do1.campo2='555' and c.campo1=o1.campo2 and
d.campo1=o1.campo3
union all
select dt1.campo4,dt1.campo5,t1.campo1,c.campo2,d.campo2
from dt1,t1,c,d
where dt1.campo1=t1.campo1 and dt1.campo2='555' and c.campo1=t1.campo2 and
d.campo1=t1.campo3

esto me tarda 15 segundos desde el analizador de consultas.

Lo he metido cada select en una tabla temporal sin hacer uniones y tarda
igual.

hay alguna manera de que tarde menos.

muchas gracias

Preguntas similare

Leer las respuestas

#11 Jose Mariano Alvarez \(MUG\)
07/06/2004 - 19:50 | Informe spam
Lo del índice sobre el SARG (d.referencia) lo has probado?
Era lo más importante.

La reescritura del join que te he pasado no fue para que tarde menos sino
para entender los joins y para que quede con la sintaxis recomendada.

No creo que el rescribir el query haga que los planes varíen a menos que yo
haya escrito algo mal. No debería haber diferencia si las estadísticas están
actualizadas.

Otra forma de hacerlo es la que te copio abajo, donde indicas la condición
dentro de la cláusula ON del join para que restrinja antes de hacer el join.
Este tipo de cosas normalmente las aplica el planificador automáticamente
sin inconvenientes aunque se las indiques en el WHERE.

SELECT
a.fecha AS fecha,
'A' as tipo,
p.rsocial,
d.nalbaran AS ndocumento,
a.ncliente,
d.cantidad,
d.pvp,
d.importe,
d.descuento,
d.descuento2,
d.descuento3,
a.divisa,
div.ndecimales
FROM
DETALLES_ALB_CLI AS d
join albaranes_cli AS a
on a.nalbaran = d.nalbaran
AND a.nfactura IS NULL
join clientes as p on p.ncliente=a.ncliente
join divisas as div on div.codigo=a.divisa
WHERE
d.referencia = '00012555'








Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar



"reo" wrote in message
news:
he comparado el select con el join como dices , con el select que os pase


y
el del join tarda 21 segundo y el normal 11.

"Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* * mug.org.ar>


escribió
en el mensaje news:
> El primero de los select del union quedaría así si lo acomodo un poco:
>
> SELECT
> a.fecha AS fecha,
> 'A' as tipo,
> p.rsocial,
> d.nalbaran AS ndocumento,
> a.ncliente,
> d.cantidad,
> d.pvp,
> d.importe,
> d.descuento,
> d.descuento2,
> d.descuento3,
> a.divisa,
> div.ndecimales
> FROM
> DETALLES_ALB_CLI AS d
> join albaranes_cli AS a on a.nalbaran = d.nalbaran
> join clientes as p on p.ncliente=a.ncliente
> join divisas as div on div.codigo=a.divisa
> WHERE
> d.referencia = '00012555'
> AND a.nfactura IS NULL
>
>
> d.referencia = '00012555' puede ser usado como un SARG por lo cual
podrías
> poner un índice si la cardinalidad es buena (presumo debería ser así).
>
> Ahora esta haciendo un SCAN del indice y casi seguro puede eliminarse.
>
> Lo mismo ocurre en cada uno de los select del UNION.
>
>
> Jose Mariano Alvarez
> Comunidad de base de datos
> Grupo de Usuarios Microsoft
> www.mug.org.ar
>
>
> "reo" wrote in message
> news:
> > bueno realmente el select es:
> >
> > SELECT a.fecha AS fecha, 'A' as tipo,p.rsocial,d.nalbaran AS
> > ndocumento,a.ncliente, d.cantidad,d.pvp, d.importe,
> > d.descuento,d.descuento2,d.descuento3,a.divisa,div.ndecimales
> > FROM DETALLES_ALB_CLI AS d, albaranes_cli AS a,clientes as p,divisas


as
> div
> > WHERE d.referencia = '00012555' AND a.nalbaran = d.nalbaran AND
a.nfactura
> > IS NULL and p.ncliente=a.ncliente and div.codigo=a.divisa
> > UNION all
> > SELECT f.fecha AS fecha,'F' as tipo,p.rsocial, d.nfactura AS
> > ndocumento,f.ncliente, d.cantidad,d.pvp, d.importe,
> > d.descuento,d.descuento2,d.descuento3,f.divisa,div.ndecimales
> > FROM DETALLES_FAC_CLI AS d, facturas_cli AS f,clientes as p,divisas as
div
> > WHERE d.referencia = '00012555' AND f.nfactura = d.nfactura and
> > p.ncliente=f.ncliente and div.codigo=f.divisa
> > UNION all
> > select o.fecha as fecha,'O' as tipo,cl.rsocial,o.norden as
> > ndocumento,c.ncliente,d.cantidad,d.pvp,d.importe,d.descuento,0 as
> > descuento2,0 as descuento3,o.divisa,div.ndecimales
> > from detalles_orden as d,ordenes as o,incidencias as i,centros as
> c,clientes
> > as cl,divisas as div
> > where o.nincidencia=i.nincidencia and i.ncentro=c.ncentro and
> > c.ncliente=cl.ncliente and d.referencia='00012555'
> > and o.norden=d.norden and div.codigo=o.divisa and o.nfactura is null
> > UNION all
> > select t.fecha as fecha,'T' as tipo,c.rsocial,t.nticket as
> > ndocumento,t.ncliente,d.cantidad,d.pvp,d.importe,d.descuento,0 as
> > descuento2,0 as descuento3,t.divisa,div.ndecimales
> > from detalles_tickets as d,tickets as t left outer join clientes as c


on
> > t.ncliente=c.ncliente,divisas as div
> > where d.nticket=t.nticket and div.codigo=t.divisa and t.nfactura is


null
> and
> > d.referencia='00012555'
> > ORDER BY fecha DESC
> > y el plan esta en el fichero adjunto
> >
> >
> > "Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* * mug.org.ar>
> escribió
> > en el mensaje news:
> > > La verdad es que los nombres de campo ni los de las tablas ayudan
mucho
> a
> > > interpretar tu modelo.
> > > Tampoco se si hay mejores alternativas.
> > > Por que no pasas un queryplan (set showplan_all) en un adjunto de
texto
> > > (notepad) para ver el plan que tienes.
> > >
> > >
> > > Jose Mariano Alvarez
> > > Comunidad de base de datos
> > > Grupo de Usuarios Microsoft
> > > www.mug.org.ar
> > >
> > >
> > >
> > > "reo" wrote in message
> > > news:OE$zM$
> > > > si te refieres a pulsar en el menu consulta a la opcion realizar


un
> > > analisis
> > > > de indice , me da:
> > > >
> > > > No se sugirió ningún índice por uno de los siguientes motivos:
> > > > 1. Las tablas tenían menos de 10 páginas de datos.
> > > > 2. Ya existen los índices.
> > > > 3. Sólo mejoraría el rendimiento de un índice agrupado.
> > > >
> > > > otra cosa , por si ayuda a algo, si no pongo los filtros
campo2='555'
> > > > tengo que me salen despues de unos 10 minutos mas de 400000
registros
> > > >
> > > > tengo actualizar estadisticas automaticamente y crear estadisticas
> > > > automaticamente activados.
> > > > Es un servidor con algo de carga.
> > > >
> > > >
> > > > "Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* *


mug.org.ar>
> > > escribió
> > > > en el mensaje news:
> > > > > Es el tiempo que tarda en poner todo en memoria.
> > > > > No creo que puedas mejorar este tiempo si no puedes cambiar la
> > consulta
> > > o
> > > > > mejorarla.
> > > > > 12 segundos es una eternidad si los volúmenes son pequeños.
> > > > > Ejecutaste el asistente tal como te comento Javier?
> > > > > Las estadísticas estan actualizadas ?
> > > > > Tienes la creacion automática de estadísticas activada?
> > > > >
> > > > > Saludos
> > > > >
> > > > > Jose Mariano Alvarez
> > > > > Comunidad de base de datos
> > > > > Grupo de Usuarios Microsoft
> > > > > www.mug.org.ar
> > > > >
> > > > >
> > > > >
> > > > > "reo" wrote in message
> > > > > news:%23JMq$
> > > > > > no tenia ningun indice, he puesto a todas las tablas y ahora
> > > > > > en la primera vez que la ejecuto me tarda 12 segundos y si la
haga
> > una
> > > > > > segunda vez tarda 2 segundos
> > > > > > es decir, he mejorado, pero como puedo hacer que la primera
> tambien
> >
> > > > tarde
> > > > > 2
> > > > > > segundos.
> > > > > >
> > > > > > muchas gracias
> > > > > >
> > > > > >
> > > > > > "Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* *
> mug.org.ar>
> > > > > escribió
> > > > > > en el mensaje news:%
> > > > > > > Puedes intentar creando cover index sobre las tablas
> > > > > > > C (campo1,campo2)
> > > > > > > D (campo1,campo2)
> > > > > > > A1 (campo1,campo2,campo3)
> > > > > > > CA(campo2,campo1,campo4,campo5)
> > > > > > >
> > > > > > >
> > > > > > > Por otro lado todo esto es muy relativo ya que no sabemos


nada
> del
> > > > > diseño
> > > > > > de
> > > > > > > las tablas, no sabemos nada de los indices existentes, ni de
la
> > > > > > cardinalidad
> > > > > > > de la información. Tal como te dijo Javier el Index Tuning
> Wizard
> > es
> > > > una
> > > > > > de
> > > > > > > las mejores alternativas.
> > > > > > >
> > > > > > > Además yo cambiaría de sintaxis
> > > > > > >
> > > > > > > select
> > > > > > > da1.campo4,
> > > > > > > da1.campo5,
> > > > > > > a1.campo1,
> > > > > > > c.campo2,
> > > > > > > d.campo2
> > > > > > > from
> > > > > > > da1,
> > > > > > > a1,
> > > > > > > c,
> > > > > > > d
> > > > > > > where
> > > > > > > da1.campo1¡.campo1
> > > > > > > and da1.campo2='555'
> > > > > > > and c.campo1¡.campo2
> > > > > > > and d.campo1¡.campo3
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > select
> > > > > > > da1.campo4,
> > > > > > > da1.campo5,
> > > > > > > d1.campo1, -- lo cambie
> > > > > > > c.campo2,
> > > > > > > d.campo2
> > > > > > > from
> > > > > > > da1
> > > > > > > join a1 on da1.campo1¡.campo1
> > > > > > > join c on c.campo1¡.campo2
> > > > > > > join d on d.campo1¡.campo3
> > > > > > > where
> > > > > > > da1.campo2='555'
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Jose Mariano Alvarez
> > > > > > > Comunidad de base de datos
> > > > > > > Grupo de Usuarios Microsoft
> > > > > > > www.mug.org.ar
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > "reo" wrote in message
> > > > > > > news:
> > > > > > > > tengo el select:
> > > > > > > >
> > > > > > > > select da1.campo4,da1.campo5,a1.campo1,c.campo2,d.campo2
> > > > > > > > from da1,a1,c,d
> > > > > > > > where da1.campo1¡.campo1 and da1.campo2='555' and
> > > > c.campo1¡.campo2
> > > > > > and
> > > > > > > > d.campo1¡.campo3
> > > > > > > > union all
> > > > > > > > select df1.campo4,df1.campo5,f1.campo1,c.campo2,d.campo2
> > > > > > > > from df1,f1,c,d
> > > > > > > > where df1.campo1ñ.campo1 and df1.campo2='555' and
> > > > c.campo1ñ.campo2
> > > > > > and
> > > > > > > > d.campo1ñ.campo3
> > > > > > > > union all
> > > > > > > > select do1.campo4,do1.campo5,o1.campo1,c.campo2,d.campo2
> > > > > > > > from do1,o1,c,d
> > > > > > > > where da1.campo1=o1.campo1 and do1.campo2='555' and
> > > > c.campo1=o1.campo2
> > > > > > and
> > > > > > > > d.campo1=o1.campo3
> > > > > > > > union all
> > > > > > > > select dt1.campo4,dt1.campo5,t1.campo1,c.campo2,d.campo2
> > > > > > > > from dt1,t1,c,d
> > > > > > > > where dt1.campo1=t1.campo1 and dt1.campo2='555' and
> > > c.campo1=t1.camp
> > > > o2
> > > > > > and
> > > > > > > > d.campo1=t1.campo3
> > > > > > > >
> > > > > > > > esto me tarda 15 segundos desde el analizador de


consultas.
> > > > > > > >
> > > > > > > > Lo he metido cada select en una tabla temporal sin hacer
> uniones
> > y
> > > > > tarda
> > > > > > > > igual.
> > > > > > > >
> > > > > > > > hay alguna manera de que tarde menos.
> > > > > > > >
> > > > > > > > muchas gracias
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
> >
>
>
>
> Revisado por AVG
>
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.698 / Virus Database: 455 - Release Date: 03/06/2004
>
>


Respuesta Responder a este mensaje
#12 reo
08/06/2004 - 11:24 | Informe spam
como pruebo eso de SARG (d.referencia)?

"Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* * mug.org.ar> escribió
en el mensaje news:%23$c%
Lo del índice sobre el SARG (d.referencia) lo has probado?
Era lo más importante.

La reescritura del join que te he pasado no fue para que tarde menos sino
para entender los joins y para que quede con la sintaxis recomendada.

No creo que el rescribir el query haga que los planes varíen a menos que


yo
haya escrito algo mal. No debería haber diferencia si las estadísticas


están
actualizadas.

Otra forma de hacerlo es la que te copio abajo, donde indicas la condición
dentro de la cláusula ON del join para que restrinja antes de hacer el


join.
Este tipo de cosas normalmente las aplica el planificador automáticamente
sin inconvenientes aunque se las indiques en el WHERE.

SELECT
a.fecha AS fecha,
'A' as tipo,
p.rsocial,
d.nalbaran AS ndocumento,
a.ncliente,
d.cantidad,
d.pvp,
d.importe,
d.descuento,
d.descuento2,
d.descuento3,
a.divisa,
div.ndecimales
FROM
DETALLES_ALB_CLI AS d
join albaranes_cli AS a
on a.nalbaran = d.nalbaran
AND a.nfactura IS NULL
join clientes as p on p.ncliente=a.ncliente
join divisas as div on div.codigo=a.divisa
WHERE
d.referencia = '00012555'








Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar



"reo" wrote in message
news:
> he comparado el select con el join como dices , con el select que os


pase
y
> el del join tarda 21 segundo y el normal 11.
>
> "Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* * mug.org.ar>
escribió
> en el mensaje news:
> > El primero de los select del union quedaría así si lo acomodo un poco:
> >
> > SELECT
> > a.fecha AS fecha,
> > 'A' as tipo,
> > p.rsocial,
> > d.nalbaran AS ndocumento,
> > a.ncliente,
> > d.cantidad,
> > d.pvp,
> > d.importe,
> > d.descuento,
> > d.descuento2,
> > d.descuento3,
> > a.divisa,
> > div.ndecimales
> > FROM
> > DETALLES_ALB_CLI AS d
> > join albaranes_cli AS a on a.nalbaran = d.nalbaran
> > join clientes as p on p.ncliente=a.ncliente
> > join divisas as div on div.codigo=a.divisa
> > WHERE
> > d.referencia = '00012555'
> > AND a.nfactura IS NULL
> >
> >
> > d.referencia = '00012555' puede ser usado como un SARG por lo cual
> podrías
> > poner un índice si la cardinalidad es buena (presumo debería ser así).
> >
> > Ahora esta haciendo un SCAN del indice y casi seguro puede eliminarse.
> >
> > Lo mismo ocurre en cada uno de los select del UNION.
> >
> >
> > Jose Mariano Alvarez
> > Comunidad de base de datos
> > Grupo de Usuarios Microsoft
> > www.mug.org.ar
> >
> >
> > "reo" wrote in message
> > news:
> > > bueno realmente el select es:
> > >
> > > SELECT a.fecha AS fecha, 'A' as tipo,p.rsocial,d.nalbaran AS
> > > ndocumento,a.ncliente, d.cantidad,d.pvp, d.importe,
> > > d.descuento,d.descuento2,d.descuento3,a.divisa,div.ndecimales
> > > FROM DETALLES_ALB_CLI AS d, albaranes_cli AS a,clientes as p,divisas
as
> > div
> > > WHERE d.referencia = '00012555' AND a.nalbaran = d.nalbaran AND
> a.nfactura
> > > IS NULL and p.ncliente=a.ncliente and div.codigo=a.divisa
> > > UNION all
> > > SELECT f.fecha AS fecha,'F' as tipo,p.rsocial, d.nfactura AS
> > > ndocumento,f.ncliente, d.cantidad,d.pvp, d.importe,
> > > d.descuento,d.descuento2,d.descuento3,f.divisa,div.ndecimales
> > > FROM DETALLES_FAC_CLI AS d, facturas_cli AS f,clientes as p,divisas


as
> div
> > > WHERE d.referencia = '00012555' AND f.nfactura = d.nfactura and
> > > p.ncliente=f.ncliente and div.codigo=f.divisa
> > > UNION all
> > > select o.fecha as fecha,'O' as tipo,cl.rsocial,o.norden as
> > > ndocumento,c.ncliente,d.cantidad,d.pvp,d.importe,d.descuento,0 as
> > > descuento2,0 as descuento3,o.divisa,div.ndecimales
> > > from detalles_orden as d,ordenes as o,incidencias as i,centros as
> > c,clientes
> > > as cl,divisas as div
> > > where o.nincidencia=i.nincidencia and i.ncentro=c.ncentro and
> > > c.ncliente=cl.ncliente and d.referencia='00012555'
> > > and o.norden=d.norden and div.codigo=o.divisa and o.nfactura is null
> > > UNION all
> > > select t.fecha as fecha,'T' as tipo,c.rsocial,t.nticket as
> > > ndocumento,t.ncliente,d.cantidad,d.pvp,d.importe,d.descuento,0 as
> > > descuento2,0 as descuento3,t.divisa,div.ndecimales
> > > from detalles_tickets as d,tickets as t left outer join clientes as


c
on
> > > t.ncliente=c.ncliente,divisas as div
> > > where d.nticket=t.nticket and div.codigo=t.divisa and t.nfactura is
null
> > and
> > > d.referencia='00012555'
> > > ORDER BY fecha DESC
> > > y el plan esta en el fichero adjunto
> > >
> > >
> > > "Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* * mug.org.ar>
> > escribió
> > > en el mensaje news:
> > > > La verdad es que los nombres de campo ni los de las tablas ayudan
> mucho
> > a
> > > > interpretar tu modelo.
> > > > Tampoco se si hay mejores alternativas.
> > > > Por que no pasas un queryplan (set showplan_all) en un adjunto de
> texto
> > > > (notepad) para ver el plan que tienes.
> > > >
> > > >
> > > > Jose Mariano Alvarez
> > > > Comunidad de base de datos
> > > > Grupo de Usuarios Microsoft
> > > > www.mug.org.ar
> > > >
> > > >
> > > >
> > > > "reo" wrote in message
> > > > news:OE$zM$
> > > > > si te refieres a pulsar en el menu consulta a la opcion realizar
un
> > > > analisis
> > > > > de indice , me da:
> > > > >
> > > > > No se sugirió ningún índice por uno de los siguientes motivos:
> > > > > 1. Las tablas tenían menos de 10 páginas de datos.
> > > > > 2. Ya existen los índices.
> > > > > 3. Sólo mejoraría el rendimiento de un índice agrupado.
> > > > >
> > > > > otra cosa , por si ayuda a algo, si no pongo los filtros
> campo2='555'
> > > > > tengo que me salen despues de unos 10 minutos mas de 400000
> registros
> > > > >
> > > > > tengo actualizar estadisticas automaticamente y crear


estadisticas
> > > > > automaticamente activados.
> > > > > Es un servidor con algo de carga.
> > > > >
> > > > >
> > > > > "Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* *
mug.org.ar>
> > > > escribió
> > > > > en el mensaje news:
> > > > > > Es el tiempo que tarda en poner todo en memoria.
> > > > > > No creo que puedas mejorar este tiempo si no puedes cambiar la
> > > consulta
> > > > o
> > > > > > mejorarla.
> > > > > > 12 segundos es una eternidad si los volúmenes son pequeños.
> > > > > > Ejecutaste el asistente tal como te comento Javier?
> > > > > > Las estadísticas estan actualizadas ?
> > > > > > Tienes la creacion automática de estadísticas activada?
> > > > > >
> > > > > > Saludos
> > > > > >
> > > > > > Jose Mariano Alvarez
> > > > > > Comunidad de base de datos
> > > > > > Grupo de Usuarios Microsoft
> > > > > > www.mug.org.ar
> > > > > >
> > > > > >
> > > > > >
> > > > > > "reo" wrote in message
> > > > > > news:%23JMq$
> > > > > > > no tenia ningun indice, he puesto a todas las tablas y ahora
> > > > > > > en la primera vez que la ejecuto me tarda 12 segundos y si


la
> haga
> > > una
> > > > > > > segunda vez tarda 2 segundos
> > > > > > > es decir, he mejorado, pero como puedo hacer que la primera
> > tambien
> > >
> > > > > tarde
> > > > > > 2
> > > > > > > segundos.
> > > > > > >
> > > > > > > muchas gracias
> > > > > > >
> > > > > > >
> > > > > > > "Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* *
> > mug.org.ar>
> > > > > > escribió
> > > > > > > en el mensaje news:%
> > > > > > > > Puedes intentar creando cover index sobre las tablas
> > > > > > > > C (campo1,campo2)
> > > > > > > > D (campo1,campo2)
> > > > > > > > A1 (campo1,campo2,campo3)
> > > > > > > > CA(campo2,campo1,campo4,campo5)
> > > > > > > >
> > > > > > > >
> > > > > > > > Por otro lado todo esto es muy relativo ya que no sabemos
nada
> > del
> > > > > > diseño
> > > > > > > de
> > > > > > > > las tablas, no sabemos nada de los indices existentes, ni


de
> la
> > > > > > > cardinalidad
> > > > > > > > de la información. Tal como te dijo Javier el Index Tuning
> > Wizard
> > > es
> > > > > una
> > > > > > > de
> > > > > > > > las mejores alternativas.
> > > > > > > >
> > > > > > > > Además yo cambiaría de sintaxis
> > > > > > > >
> > > > > > > > select
> > > > > > > > da1.campo4,
> > > > > > > > da1.campo5,
> > > > > > > > a1.campo1,
> > > > > > > > c.campo2,
> > > > > > > > d.campo2
> > > > > > > > from
> > > > > > > > da1,
> > > > > > > > a1,
> > > > > > > > c,
> > > > > > > > d
> > > > > > > > where
> > > > > > > > da1.campo1¡.campo1
> > > > > > > > and da1.campo2='555'
> > > > > > > > and c.campo1¡.campo2
> > > > > > > > and d.campo1¡.campo3
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > select
> > > > > > > > da1.campo4,
> > > > > > > > da1.campo5,
> > > > > > > > d1.campo1, -- lo cambie
> > > > > > > > c.campo2,
> > > > > > > > d.campo2
> > > > > > > > from
> > > > > > > > da1
> > > > > > > > join a1 on da1.campo1¡.campo1
> > > > > > > > join c on c.campo1¡.campo2
> > > > > > > > join d on d.campo1¡.campo3
> > > > > > > > where
> > > > > > > > da1.campo2='555'
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > Jose Mariano Alvarez
> > > > > > > > Comunidad de base de datos
> > > > > > > > Grupo de Usuarios Microsoft
> > > > > > > > www.mug.org.ar
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > "reo" wrote in message
> > > > > > > > news:
> > > > > > > > > tengo el select:
> > > > > > > > >
> > > > > > > > > select da1.campo4,da1.campo5,a1.campo1,c.campo2,d.campo2
> > > > > > > > > from da1,a1,c,d
> > > > > > > > > where da1.campo1¡.campo1 and da1.campo2='555' and
> > > > > c.campo1¡.campo2
> > > > > > > and
> > > > > > > > > d.campo1¡.campo3
> > > > > > > > > union all
> > > > > > > > > select df1.campo4,df1.campo5,f1.campo1,c.campo2,d.campo2
> > > > > > > > > from df1,f1,c,d
> > > > > > > > > where df1.campo1ñ.campo1 and df1.campo2='555' and
> > > > > c.campo1ñ.campo2
> > > > > > > and
> > > > > > > > > d.campo1ñ.campo3
> > > > > > > > > union all
> > > > > > > > > select do1.campo4,do1.campo5,o1.campo1,c.campo2,d.campo2
> > > > > > > > > from do1,o1,c,d
> > > > > > > > > where da1.campo1=o1.campo1 and do1.campo2='555' and
> > > > > c.campo1=o1.campo2
> > > > > > > and
> > > > > > > > > d.campo1=o1.campo3
> > > > > > > > > union all
> > > > > > > > > select dt1.campo4,dt1.campo5,t1.campo1,c.campo2,d.campo2
> > > > > > > > > from dt1,t1,c,d
> > > > > > > > > where dt1.campo1=t1.campo1 and dt1.campo2='555' and
> > > > c.campo1=t1.camp
> > > > > o2
> > > > > > > and
> > > > > > > > > d.campo1=t1.campo3
> > > > > > > > >
> > > > > > > > > esto me tarda 15 segundos desde el analizador de
consultas.
> > > > > > > > >
> > > > > > > > > Lo he metido cada select en una tabla temporal sin hacer

> > uniones
> > > y
> > > > > > tarda
> > > > > > > > > igual.
> > > > > > > > >
> > > > > > > > > hay alguna manera de que tarde menos.
> > > > > > > > >
> > > > > > > > > muchas gracias
> > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> > >
> >
> >
> >
> > Revisado por AVG
> >
> > Checked by AVG anti-virus system (http://www.grisoft.com).
> > Version: 6.0.698 / Virus Database: 455 - Release Date: 03/06/2004
> >
> >
>
>


Respuesta Responder a este mensaje
#13 Jose Mariano Alvarez \(MUG\)
09/06/2004 - 00:25 | Informe spam
Creando un índice por esa columna.


Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar


"reo" wrote in message
news:
como pruebo eso de SARG (d.referencia)?

"Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* * mug.org.ar>


escribió
en el mensaje news:%23$c%
> Lo del índice sobre el SARG (d.referencia) lo has probado?
> Era lo más importante.
>
> La reescritura del join que te he pasado no fue para que tarde menos


sino
> para entender los joins y para que quede con la sintaxis recomendada.
>
> No creo que el rescribir el query haga que los planes varíen a menos que
yo
> haya escrito algo mal. No debería haber diferencia si las estadísticas
están
> actualizadas.
>
> Otra forma de hacerlo es la que te copio abajo, donde indicas la


condición
> dentro de la cláusula ON del join para que restrinja antes de hacer el
join.
> Este tipo de cosas normalmente las aplica el planificador


automáticamente
> sin inconvenientes aunque se las indiques en el WHERE.
>
> SELECT
> a.fecha AS fecha,
> 'A' as tipo,
> p.rsocial,
> d.nalbaran AS ndocumento,
> a.ncliente,
> d.cantidad,
> d.pvp,
> d.importe,
> d.descuento,
> d.descuento2,
> d.descuento3,
> a.divisa,
> div.ndecimales
> FROM
> DETALLES_ALB_CLI AS d
> join albaranes_cli AS a
> on a.nalbaran = d.nalbaran
> AND a.nfactura IS NULL
> join clientes as p on p.ncliente=a.ncliente
> join divisas as div on div.codigo=a.divisa
> WHERE
> d.referencia = '00012555'
>
>
>
>
>
>
>
>
> Jose Mariano Alvarez
> Comunidad de base de datos
> Grupo de Usuarios Microsoft
> www.mug.org.ar
>
>
>
> "reo" wrote in message
> news:
> > he comparado el select con el join como dices , con el select que os
pase
> y
> > el del join tarda 21 segundo y el normal 11.
> >
> > "Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* * mug.org.ar>
> escribió
> > en el mensaje news:
> > > El primero de los select del union quedaría así si lo acomodo un


poco:
> > >
> > > SELECT
> > > a.fecha AS fecha,
> > > 'A' as tipo,
> > > p.rsocial,
> > > d.nalbaran AS ndocumento,
> > > a.ncliente,
> > > d.cantidad,
> > > d.pvp,
> > > d.importe,
> > > d.descuento,
> > > d.descuento2,
> > > d.descuento3,
> > > a.divisa,
> > > div.ndecimales
> > > FROM
> > > DETALLES_ALB_CLI AS d
> > > join albaranes_cli AS a on a.nalbaran = d.nalbaran
> > > join clientes as p on p.ncliente=a.ncliente
> > > join divisas as div on div.codigo=a.divisa
> > > WHERE
> > > d.referencia = '00012555'
> > > AND a.nfactura IS NULL
> > >
> > >
> > > d.referencia = '00012555' puede ser usado como un SARG por lo cual
> > podrías
> > > poner un índice si la cardinalidad es buena (presumo debería ser


así).
> > >
> > > Ahora esta haciendo un SCAN del indice y casi seguro puede


eliminarse.
> > >
> > > Lo mismo ocurre en cada uno de los select del UNION.
> > >
> > >
> > > Jose Mariano Alvarez
> > > Comunidad de base de datos
> > > Grupo de Usuarios Microsoft
> > > www.mug.org.ar
> > >
> > >
> > > "reo" wrote in message
> > > news:
> > > > bueno realmente el select es:
> > > >
> > > > SELECT a.fecha AS fecha, 'A' as tipo,p.rsocial,d.nalbaran AS
> > > > ndocumento,a.ncliente, d.cantidad,d.pvp, d.importe,
> > > > d.descuento,d.descuento2,d.descuento3,a.divisa,div.ndecimales
> > > > FROM DETALLES_ALB_CLI AS d, albaranes_cli AS a,clientes as


p,divisas
> as
> > > div
> > > > WHERE d.referencia = '00012555' AND a.nalbaran = d.nalbaran AND
> > a.nfactura
> > > > IS NULL and p.ncliente=a.ncliente and div.codigo=a.divisa
> > > > UNION all
> > > > SELECT f.fecha AS fecha,'F' as tipo,p.rsocial, d.nfactura AS
> > > > ndocumento,f.ncliente, d.cantidad,d.pvp, d.importe,
> > > > d.descuento,d.descuento2,d.descuento3,f.divisa,div.ndecimales
> > > > FROM DETALLES_FAC_CLI AS d, facturas_cli AS f,clientes as


p,divisas
as
> > div
> > > > WHERE d.referencia = '00012555' AND f.nfactura = d.nfactura and
> > > > p.ncliente=f.ncliente and div.codigo=f.divisa
> > > > UNION all
> > > > select o.fecha as fecha,'O' as tipo,cl.rsocial,o.norden as
> > > > ndocumento,c.ncliente,d.cantidad,d.pvp,d.importe,d.descuento,0 as
> > > > descuento2,0 as descuento3,o.divisa,div.ndecimales
> > > > from detalles_orden as d,ordenes as o,incidencias as i,centros as
> > > c,clientes
> > > > as cl,divisas as div
> > > > where o.nincidencia=i.nincidencia and i.ncentro=c.ncentro and
> > > > c.ncliente=cl.ncliente and d.referencia='00012555'
> > > > and o.norden=d.norden and div.codigo=o.divisa and o.nfactura is


null
> > > > UNION all
> > > > select t.fecha as fecha,'T' as tipo,c.rsocial,t.nticket as
> > > > ndocumento,t.ncliente,d.cantidad,d.pvp,d.importe,d.descuento,0 as
> > > > descuento2,0 as descuento3,t.divisa,div.ndecimales
> > > > from detalles_tickets as d,tickets as t left outer join clientes


as
c
> on
> > > > t.ncliente=c.ncliente,divisas as div
> > > > where d.nticket=t.nticket and div.codigo=t.divisa and t.nfactura


is
> null
> > > and
> > > > d.referencia='00012555'
> > > > ORDER BY fecha DESC
> > > > y el plan esta en el fichero adjunto
> > > >
> > > >
> > > > "Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* *


mug.org.ar>
> > > escribió
> > > > en el mensaje news:
> > > > > La verdad es que los nombres de campo ni los de las tablas


ayudan
> > mucho
> > > a
> > > > > interpretar tu modelo.
> > > > > Tampoco se si hay mejores alternativas.
> > > > > Por que no pasas un queryplan (set showplan_all) en un adjunto


de
> > texto
> > > > > (notepad) para ver el plan que tienes.
> > > > >
> > > > >
> > > > > Jose Mariano Alvarez
> > > > > Comunidad de base de datos
> > > > > Grupo de Usuarios Microsoft
> > > > > www.mug.org.ar
> > > > >
> > > > >
> > > > >
> > > > > "reo" wrote in message
> > > > > news:OE$zM$
> > > > > > si te refieres a pulsar en el menu consulta a la opcion


realizar
> un
> > > > > analisis
> > > > > > de indice , me da:
> > > > > >
> > > > > > No se sugirió ningún índice por uno de los siguientes motivos:
> > > > > > 1. Las tablas tenían menos de 10 páginas de datos.
> > > > > > 2. Ya existen los índices.
> > > > > > 3. Sólo mejoraría el rendimiento de un índice agrupado.
> > > > > >
> > > > > > otra cosa , por si ayuda a algo, si no pongo los filtros
> > campo2='555'
> > > > > > tengo que me salen despues de unos 10 minutos mas de 400000
> > registros
> > > > > >
> > > > > > tengo actualizar estadisticas automaticamente y crear
estadisticas
> > > > > > automaticamente activados.
> > > > > > Es un servidor con algo de carga.
> > > > > >
> > > > > >
> > > > > > "Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* *
> mug.org.ar>
> > > > > escribió
> > > > > > en el mensaje news:
> > > > > > > Es el tiempo que tarda en poner todo en memoria.
> > > > > > > No creo que puedas mejorar este tiempo si no puedes cambiar


la
> > > > consulta
> > > > > o
> > > > > > > mejorarla.
> > > > > > > 12 segundos es una eternidad si los volúmenes son pequeños.
> > > > > > > Ejecutaste el asistente tal como te comento Javier?
> > > > > > > Las estadísticas estan actualizadas ?
> > > > > > > Tienes la creacion automática de estadísticas activada?
> > > > > > >
> > > > > > > Saludos
> > > > > > >
> > > > > > > Jose Mariano Alvarez
> > > > > > > Comunidad de base de datos
> > > > > > > Grupo de Usuarios Microsoft
> > > > > > > www.mug.org.ar
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > "reo" wrote in message
> > > > > > > news:%23JMq$
> > > > > > > > no tenia ningun indice, he puesto a todas las tablas y


ahora
> > > > > > > > en la primera vez que la ejecuto me tarda 12 segundos y si
la
> > haga
> > > > una
> > > > > > > > segunda vez tarda 2 segundos
> > > > > > > > es decir, he mejorado, pero como puedo hacer que la


primera
> > > tambien
> > > >
> > > > > > tarde
> > > > > > > 2
> > > > > > > > segundos.
> > > > > > > >
> > > > > > > > muchas gracias
> > > > > > > >
> > > > > > > >
> > > > > > > > "Jose Mariano Alvarez (MUG)" <jose.alvarez * *Arroba* *
> > > mug.org.ar>
> > > > > > > escribió
> > > > > > > > en el mensaje


news:%
> > > > > > > > > Puedes intentar creando cover index sobre las tablas
> > > > > > > > > C (campo1,campo2)
> > > > > > > > > D (campo1,campo2)
> > > > > > > > > A1 (campo1,campo2,campo3)
> > > > > > > > > CA(campo2,campo1,campo4,campo5)
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > Por otro lado todo esto es muy relativo ya que no


sabemos
> nada
> > > del
> > > > > > > diseño
> > > > > > > > de
> > > > > > > > > las tablas, no sabemos nada de los indices existentes,


ni
de
> > la
> > > > > > > > cardinalidad
> > > > > > > > > de la información. Tal como te dijo Javier el Index


Tuning
> > > Wizard
> > > > es
> > > > > > una
> > > > > > > > de
> > > > > > > > > las mejores alternativas.
> > > > > > > > >
> > > > > > > > > Además yo cambiaría de sintaxis
> > > > > > > > >
> > > > > > > > > select
> > > > > > > > > da1.campo4,
> > > > > > > > > da1.campo5,
> > > > > > > > > a1.campo1,
> > > > > > > > > c.campo2,
> > > > > > > > > d.campo2
> > > > > > > > > from
> > > > > > > > > da1,
> > > > > > > > > a1,
> > > > > > > > > c,
> > > > > > > > > d
> > > > > > > > > where
> > > > > > > > > da1.campo1¡.campo1
> > > > > > > > > and da1.campo2='555'
> > > > > > > > > and c.campo1¡.campo2
> > > > > > > > > and d.campo1¡.campo3
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > select
> > > > > > > > > da1.campo4,
> > > > > > > > > da1.campo5,
> > > > > > > > > d1.campo1, -- lo cambie
> > > > > > > > > c.campo2,
> > > > > > > > > d.campo2
> > > > > > > > > from
> > > > > > > > > da1
> > > > > > > > > join a1 on da1.campo1¡.campo1
> > > > > > > > > join c on c.campo1¡.campo2
> > > > > > > > > join d on d.campo1¡.campo3
> > > > > > > > > where
> > > > > > > > > da1.campo2='555'
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > Jose Mariano Alvarez
> > > > > > > > > Comunidad de base de datos
> > > > > > > > > Grupo de Usuarios Microsoft
> > > > > > > > > www.mug.org.ar
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > "reo" wrote in message
> > > > > > > > > news:
> > > > > > > > > > tengo el select:
> > > > > > > > > >
> > > > > > > > > > select


da1.campo4,da1.campo5,a1.campo1,c.campo2,d.campo2
> > > > > > > > > > from da1,a1,c,d
> > > > > > > > > > where da1.campo1¡.campo1 and da1.campo2='555' and
> > > > > > c.campo1¡.campo2
> > > > > > > > and
> > > > > > > > > > d.campo1¡.campo3
> > > > > > > > > > union all
> > > > > > > > > > select


df1.campo4,df1.campo5,f1.campo1,c.campo2,d.campo2
> > > > > > > > > > from df1,f1,c,d
> > > > > > > > > > where df1.campo1ñ.campo1 and df1.campo2='555' and
> > > > > > c.campo1ñ.campo2
> > > > > > > > and
> > > > > > > > > > d.campo1ñ.campo3
> > > > > > > > > > union all
> > > > > > > > > > select


do1.campo4,do1.campo5,o1.campo1,c.campo2,d.campo2
> > > > > > > > > > from do1,o1,c,d
> > > > > > > > > > where da1.campo1=o1.campo1 and do1.campo2='555' and
> > > > > > c.campo1=o1.campo2
> > > > > > > > and
> > > > > > > > > > d.campo1=o1.campo3
> > > > > > > > > > union all
> > > > > > > > > > select


dt1.campo4,dt1.campo5,t1.campo1,c.campo2,d.campo2
> > > > > > > > > > from dt1,t1,c,d
> > > > > > > > > > where dt1.campo1=t1.campo1 and dt1.campo2='555' and
> > > > > c.campo1=t1.camp
> > > > > > o2
> > > > > > > > and
> > > > > > > > > > d.campo1=t1.campo3
> > > > > > > > > >
> > > > > > > > > > esto me tarda 15 segundos desde el analizador de
> consultas.
> > > > > > > > > >
> > > > > > > > > > Lo he metido cada select en una tabla temporal sin


hacer

> > > uniones
> > > > y
> > > > > > > tarda
> > > > > > > > > > igual.
> > > > > > > > > >
> > > > > > > > > > hay alguna manera de que tarde menos.
> > > > > > > > > >
> > > > > > > > > > muchas gracias
> > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > > >
> > >
> > >
> > >
> > > Revisado por AVG
> > >
> > > Checked by AVG anti-virus system (http://www.grisoft.com).
> > > Version: 6.0.698 / Virus Database: 455 - Release Date: 03/06/2004
> > >
> > >
> >
> >
>
>







Revisado por AVG

Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.701 / Virus Database: 458 - Release Date: 07/06/2004
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida