Tiempo de espera agotado...

13/12/2006 - 15:53 por Daniel G. Samborski | Informe spam
Hola, me gustaria que algun super craneo ^_^ en Store me hiciera el favor de
revisar este codigo y aconsejarme como lo podria agilizar ya que si lo
ejecuto con fecha de 01/01/1900 para que tire absolutamente todo desde lo
mas viejo a lo mas nuevo demora una eternidad.
Quizas a alguien se le pueda ocurrir una forma de agilizarlo.

A @mesAbuscar y a @FechaSol1 se le pasaria 01/01/1900 para que traiga desde
lo mas viejo a lo mas nuevo...
Las tablas tienen en promedio 100000 registros.


create procedure Filtro_busqueda_deudas (@Nrocto varchar(50)='',@CodCli
varchar(50)='',
@Social varchar(50)='',@mesAbuscar datetime, @FechaSol1 datetime) as
if year(@fechasol1)='1900'
set @fechasol1=null
if year(@mesAbuscar)='1900'
set @mesAbuscar=null

create table #t (nrocto varchar(50), nrocuo varchar(50), fecven datetime,
fecpag datetime)

insert into #t select nrocto, nrocuo, fecven, fecpag
from cuotas as a
where
fecven BETWEEN CONVERT(char(6), COALESCE(@MesAbuscar,0), 112) + '01'
AND DATEADD(day,-1, DATEADD(month, 1,
convert(char(6), COALESCE(getdate(),0), 112) + '01'))
and exists (
select *
from cuotas as b
where
b.nrocto = a.nrocto
and
fecven BETWEEN CONVERT(char(6), COALESCE(@MesAbuscar,0), 112) + '01'
AND DATEADD(day,-1, DATEADD(month, 1,
convert(char(6),COALESCE(getdate(),getdate()), 112) + '01'))
)

select cli.CodCli,cuo.nrocto,cli.NroDoc, cli.Nombre, cli.NroTel, cuo.NroCuo,
cre.Cuotas, cuo.FecVen,
cre.FecSol, com.Social, com.NroTel
from creditos cre inner join clientes cli
on cre.codcli=cli.codcli
and cre.fecsol between coalesce(@FechaSol1, 0) and coalesce(@FechaSol1,
getdate())
and (cli.codcli=@codcli or cli.codcli like @Codcli+'%')
and (cre.nrocto=@nrocto or cre.nrocto like @nrocto+'%')
inner join #t as cuo
on cre.nrocto=cuo.nrocto
and cuo.fecpag is null
and cuo.fecven between coalesce(@MesAbuscar, 0) and getdate()
inner join comercio com
on cre.codcom=com.codcom
and (com.social=@Social or com.social like @social+'%')
order by cuo.fecven, cli.nombre, cre.nrocto

drop table #t




Daniel
 

Leer las respuestas

#1 Daniel G. Samborski
13/12/2006 - 16:58 | Informe spam
Hola Alejandro, muchas gracias por la respuesta y revisare el link que me
pasas.
Tengo indice en todas las tablas, salvo la temporal...Le pondre uno.


Daniel.

"Alejandro Mesa" escribió en el
mensaje news:
Daniel,

Que hay sobre la estructura de las tablas, incluyendo indices y
restricciones?. Como esperas que alguien te pueda dar un consejo respecto
a
este procedimineto sin ni siquiera tener una idea minima sobre la
estructura
de las tablas involucradas.

create procedure Filtro_busqueda_deudas (
@Nrocto varchar(50) = NULL,
@CodCli varchar(50) = NULL,
@Social varchar(50) = NULL,
@mesAbuscar datetime = NULL,
@FechaSol1 datetime = NULL
)
as
set nocount on


create table #t (
nrocto varchar(50),
nrocuo varchar(50),
fecven datetime,
fecpag datetime
)

create clustered index #t_nrocto_nu_c
on #t(fecven asc)

insert into #t
select nrocto, nrocuo, fecven, fecpag
from cuotas as a
where
fecven BETWEEN CONVERT(char(6), COALESCE(@MesAbuscar,0), 112) + '01'
AND DATEADD(day, -1, DATEADD(month, 1, convert(char(6), getdate(), 112) +
'01'))
and exists (
select *
from cuotas as b
where
b.nrocto = a.nrocto
and fecven BETWEEN CONVERT(char(6), COALESCE(@MesAbuscar,0), 112) + '01'
AND DATEADD(day,-1, DATEADD(month, 1, convert(char(6), getdate(), 112) +
'01'))
)

select
cli.CodCli,cuo.nrocto,cli.NroDoc, cli.Nombre, cli.NroTel, cuo.NroCuo,
cre.Cuotas, cuo.FecVen, cre.FecSol, com.Social, com.NroTel
from
creditos cre
inner join
clientes cli
on cre.codcli = cli.codcli
inner join #t as cuo
on cre.nrocto = cuo.nrocto
inner join comercio com
on cre.codcom = com.codcom
where
cre.fecsol between coalesce(@FechaSol1, 0) and coalesce(@FechaSol1,
getdate())
and (cli.codcli like coalesce(@Codcli, '%'))
and (cre.nrocto like coalesce(@nrocto, '%'))
and cuo.fecpag is null
and cuo.fecven between coalesce(@MesAbuscar, 0) and getdate()
and (com.social like coalesce(@social, '%'))
order by
cuo.fecven, cli.nombre, cre.nrocto

drop table #t
go

1 - No pases '19000101' a los parametros @mesAbuscar y @FechaSol1, si
despues le vas a asignar NULL cuando el valor de estos sea '19000101'.
Pasales NULL o no le pases valor alguno. No manipules el valor de los
parametros internamente, pues SQL Server usa el valor original para
generar
el plan de ejecucion.

2 - Crea al menos un indice en la tabla temporal. Yo cree un clustered por
[fecven], puesto que usas una expresion de grupo por ella.

and cuo.fecven between coalesce(@MesAbuscar, 0) and getdate()



3 - Espero tengas indices en el resto de las tablas, por las columnas que
usas para unirlas.

4 - Espero tengas indices por las columnas que usas en el filtro de la
clausula "where".

Te adjunto un link a un articulo muy interesenta sobre busqueda dinamica.

Dynamic Search Conditions in T-SQL
http://www.sommarskog.se/dyn-search.html


AMB

"Daniel G. Samborski" wrote:

Hola, me gustaria que algun super craneo ^_^ en Store me hiciera el favor
de
revisar este codigo y aconsejarme como lo podria agilizar ya que si lo
ejecuto con fecha de 01/01/1900 para que tire absolutamente todo desde lo
mas viejo a lo mas nuevo demora una eternidad.
Quizas a alguien se le pueda ocurrir una forma de agilizarlo.

A @mesAbuscar y a @FechaSol1 se le pasaria 01/01/1900 para que traiga
desde
lo mas viejo a lo mas nuevo...
Las tablas tienen en promedio 100000 registros.


create procedure Filtro_busqueda_deudas (@Nrocto varchar(50)='',@CodCli
varchar(50)='',
@Social varchar(50)='',@mesAbuscar datetime, @FechaSol1 datetime) as
if year(@fechasol1)='1900'
set @fechasol1=null
if year(@mesAbuscar)='1900'
set @mesAbuscar=null

create table #t (nrocto varchar(50), nrocuo varchar(50), fecven datetime,
fecpag datetime)

insert into #t select nrocto, nrocuo, fecven, fecpag
from cuotas as a
where
fecven BETWEEN CONVERT(char(6), COALESCE(@MesAbuscar,0), 112) + '01'
AND DATEADD(day,-1, DATEADD(month, 1,
convert(char(6), COALESCE(getdate(),0), 112) + '01'))
and exists (
select *
from cuotas as b
where
b.nrocto = a.nrocto
and
fecven BETWEEN CONVERT(char(6), COALESCE(@MesAbuscar,0), 112) + '01'
AND DATEADD(day,-1, DATEADD(month, 1,
convert(char(6),COALESCE(getdate(),getdate()), 112) + '01'))
)

select cli.CodCli,cuo.nrocto,cli.NroDoc, cli.Nombre, cli.NroTel,
cuo.NroCuo,
cre.Cuotas, cuo.FecVen,
cre.FecSol, com.Social, com.NroTel
from creditos cre inner join clientes cli
on cre.codcli=cli.codcli
and cre.fecsol between coalesce(@FechaSol1, 0) and coalesce(@FechaSol1,
getdate())
and (cli.codcli=@codcli or cli.codcli like @Codcli+'%')
and (cre.nrocto=@nrocto or cre.nrocto like @nrocto+'%')
inner join #t as cuo
on cre.nrocto=cuo.nrocto
and cuo.fecpag is null
and cuo.fecven between coalesce(@MesAbuscar, 0) and getdate()
inner join comercio com
on cre.codcom=com.codcom
and (com.social=@Social or com.social like @social+'%')
order by cuo.fecven, cli.nombre, cre.nrocto

drop table #t




Daniel



Preguntas similares