como funcionan los inserts en variables TABLE

25/08/2008 - 23:49 por César Toledo | Informe spam
hola

Estoy trabajando con una funcion en sql server,
que declara una variable TABLE @saldos

y esta tabla tiene como 1,000,000 de filas

la funcion se toma 30 minutos en hacer el INSERT de esta tabla..
me podrian decir si al hacer DECLARE @saldos TABLE ( )
tengo que especificar una llave primaria non clustered.

Es posible hacerlo ?

a que se deberá que el insert se tarde tanto.

Gracias

César

Preguntas similare

Leer las respuestas

#1 Pedro
25/08/2008 - 23:58 | Informe spam
Es raro tener que insertar tantos registros en una variable table.
Dificilmente sea necesario.
No podrías aplicar las instrucciones de seleccion directamente a las tablas
involucradas ?

"César Toledo" escribió en el mensaje
news:
hola

Estoy trabajando con una funcion en sql server,
que declara una variable TABLE @saldos

y esta tabla tiene como 1,000,000 de filas

la funcion se toma 30 minutos en hacer el INSERT de esta tabla..
me podrian decir si al hacer DECLARE @saldos TABLE ( )
tengo que especificar una llave primaria non clustered.

Es posible hacerlo ?

a que se deberá que el insert se tarde tanto.

Gracias

César
Respuesta Responder a este mensaje
#2 César Toledo
26/08/2008 - 00:06 | Informe spam
lo que sucede es que es una variable TABLE porque esta dentro de una
funcion..
alli no puedo usar tablas temporales con create table..
esta funcion determina los saldos de unos documentos..
tengo que meterlos alli, y luego aplicarle los pagos.. para obtener los
saldos.

Por eso ha quedado de esa manera.
y para hacer el analisis de vencimiento hay que leer todos los registros
de la cartera.



Pedro escribió:
Es raro tener que insertar tantos registros en una variable table.
Dificilmente sea necesario.
No podrías aplicar las instrucciones de seleccion directamente a las tablas
involucradas ?

"César Toledo" escribió en el mensaje
news:

hola

Estoy trabajando con una funcion en sql server,
que declara una variable TABLE @saldos

y esta tabla tiene como 1,000,000 de filas

la funcion se toma 30 minutos en hacer el INSERT de esta tabla..
me podrian decir si al hacer DECLARE @saldos TABLE ( )
tengo que especificar una llave primaria non clustered.

Es posible hacerlo ?

a que se deberá que el insert se tarde tanto.

Gracias

César






Respuesta Responder a este mensaje
#3 Alejandro Mesa
26/08/2008 - 00:28 | Informe spam
César Toledo,

Por que mejor no posteas el codigo?


AMB


"César Toledo" wrote:

lo que sucede es que es una variable TABLE porque esta dentro de una
funcion..
alli no puedo usar tablas temporales con create table..
esta funcion determina los saldos de unos documentos..
tengo que meterlos alli, y luego aplicarle los pagos.. para obtener los
saldos.

Por eso ha quedado de esa manera.
y para hacer el analisis de vencimiento hay que leer todos los registros
de la cartera.



Pedro escribió:
> Es raro tener que insertar tantos registros en una variable table.
> Dificilmente sea necesario.
> No podrías aplicar las instrucciones de seleccion directamente a las tablas
> involucradas ?
>
> "César Toledo" escribió en el mensaje
> news:
>
>> hola
>>
>> Estoy trabajando con una funcion en sql server,
>> que declara una variable TABLE @saldos
>>
>> y esta tabla tiene como 1,000,000 de filas
>>
>> la funcion se toma 30 minutos en hacer el INSERT de esta tabla..
>> me podrian decir si al hacer DECLARE @saldos TABLE ( )
>> tengo que especificar una llave primaria non clustered.
>>
>> Es posible hacerlo ?
>>
>> a que se deberá que el insert se tarde tanto.
>>
>> Gracias
>>
>> César
>>
>
>
>

Respuesta Responder a este mensaje
#4 César Toledo
26/08/2008 - 00:51 | Informe spam
muy bien aqui esta el codigo..

declare @Clienteini char(20), @tipocliini char(5),
@Clientefin char(20), @tipoclifin char(5),
@Distini char(20), @DistFin char(20),
@tipodeuda varchar(5), @refDeuda
varchar(20),@Fecha datetime , @tipocartera char(5),
@moneda char(3), @monedaSalida char(3)

select @clienteini = '', @clientefin = ''
select @tipocliini= '', @tipoclifin = '',
@distini = '', @distfin ='',
@tipodeuda = '', @refDeuda = '',
@fecha = '31/05/2008',
@tipocartera = 'CVD',
@moneda = 'CLP',
@monedaSalida = 'CLP'


BEGIN

declare @periodo datetime, @periodoinicial datetime,@ano char(4)
SET @ano = year(@fecha)
set @periodo = dbo.fn_PeriodoFecha (@fecha)
set @periodoinicial = '01/01/'+ datename(yy, @fecha)

if @Distini ='' select @Distini = min(Cliente) from dbo.Clientes where
tipocliente = 'DIS'
if @Distfin ='' select @Distfin = max(Cliente) from dbo.Clientes where
tipoCliente = 'DIS'
if @Distini IS NULL set @Distini = ''
if @Distfin IS NULL select @Distfin = ''
if @tipodeuda = '' set @tipodeuda = '%_%'
if @refDeuda = '' set @refDeuda = '%_%'
if @tipocartera = '' set @tipocartera = '%_%'
if @moneda = '' select @Moneda = Moneda from dbo.ParametrosDocsCobrar
if @moneda = 'ALL' select @Moneda = Moneda from
dbo.ParametrosDocsCobrar

DECLARE @SALDOS TABLE(noCorrelativo bigint, TranCobro char(5),
IdOficina char(10), EMpresa smallint,
Cuota smallint,
Cliente char(20), Tipocliente
char(5), Distribuidor char(20),
TipoDeuda char(5), Referenciadeuda
char(20),
FechaDocumento datetime,
FechaVencimiento datetime, fechaultimopago datetime,
moneda char(3), TasaCambio
Numeric(14,7), Periodo datetime,
Valor numeric(15,2)default 0,
Abonos numeric(15,2)default 0
,TipoCartera char(5),nocupon bigint,nodocumento char(20) ,
estado char(5), idsucursal char(5),
SalIndice numeric(18) identity
primary key nonclustered )

que no tienen cuotas...
DECLARE @DOCSCOBRAR TABLE (cliente char(20), tipocliente
char(5),NOCORRELATIVO char(20),
IDTRANCOBRO char(5),IDOFICINA
char(20),EMPRESA smallint,TIPOCARTERA char(5),
tipodeuda char(5),noreferenciadeuda
char(20),distribuidor char(20),
fechadocumento datetime,moneda
char(5),tasacambio tasacambiox,estado char(5),
idsucursal char(5) , periodo
datetime,valor numeric(18,3),nodocumento char(20),
DocIndice numeric(18) identity primary
key nonclustered )



IF (@Clienteini='' AND @Clientefin='' AND @tipocliini= '' AND
@tipoclifin='')
BEGIN
INSERT @SALDOS
select NoCorrelativo, IdtranCobro, Idoficina,
Empresa,
Cuota, Cliente, tipoCliente,
Distribuidor,
TipoDeuda, ReferenciaDeuda,FechaDocumento,
FechaVencimiento, null, Moneda,
TasaCambio,
Periodo, Valor, Abonos,
TipoCartera,0,referenciadeuda,'',''

from dbo.SaldosDocsCobrar
WHERE PERIODO = @periodoinicial
AND TipoCartera like @tipocartera
AND MONEDA = @moneda

INSERT @DOCSCOBRAR
SELECT cliente, tipocliente,NOCORRELATIVO,
IDTRANCOBRO,IDOFICINA,EMPRESA,TIPOCARTERA,
tipodeuda ,noreferenciadeuda ,distribuidor
,fechadocumento ,moneda ,tasacambio ,estado ,idsucursal,
periodo,valor ,noreferenciadeuda
FROM DocsCobrarHis
WHERE year(periodo) = year(@fecha)
AND FECHADOCUMENTO <= @fecha

END
ELSE
BEGIN
INSERT @SALDOS
select NoCorrelativo, IdtranCobro, Idoficina,
Empresa,
Cuota, Cliente, tipoCliente,
Distribuidor,
TipoDeuda, ReferenciaDeuda,FechaDocumento,
FechaVencimiento, null, Moneda,
TasaCambio,
Periodo, Valor, Abonos,
TipoCartera,0,referenciadeuda,'',''

from dbo.SaldosDocsCobrar
WHERE PERIODO = @periodoinicial
AND TipoCartera like @tipocartera
AND MONEDA = @moneda
AND Cliente between @Clienteini AND @Clientefin
AND tipocliente BETWEEN @tipocliini AND @tipoclifin
AND Distribuidor between @Distini AND @DistFin
AND tipodeuda like @tipodeuda
AND ReferenciaDeuda like @refDeuda


INSERT @DOCSCOBRAR
SELECT cliente, tipocliente,NOCORRELATIVO,
IDTRANCOBRO,IDOFICINA,EMPRESA,TIPOCARTERA,
tipodeuda ,noreferenciadeuda ,distribuidor
,fechadocumento ,moneda ,tasacambio ,estado ,idsucursal,
periodo,valor ,noreferenciadeuda
FROM DocsCobrarHis
WHERE year(periodo) = year(@fecha)
AND FECHADOCUMENTO <= @fecha
AND TipoCartera like @tipocartera
AND MONEDA = @moneda
AND Cliente between @Clienteini AND @Clientefin
AND tipocliente BETWEEN @tipocliini AND @tipoclifin
AND Distribuidor between @Distini AND @DistFin
AND tipodeuda like @tipodeuda
AND noReferenciaDeuda like @refDeuda
END


INSERT @SALDOS
SELECT c.NOCORRELATIVO,c.IDTRANCOBRO,c.IDOFICINA,c.EMPRESA,
c.CUOTA,d.cliente,d.tipocliente,
d.distribuidor,d.tipodeuda,d.noreferenciadeuda,
d.fechadocumento,c.FECHAVENCIMIENTO ,null,

d.moneda,d.tasacambio,d.periodo,c.VALOR,0,c.TIPOCARTERA,NoCupon,d.noreferenciadeuda,d.estado,d.idsucursal
FROM DocsCobrarHiscuotas c, @DOCSCOBRAR d
WHERE c.NOCORRELATIVO = d.NOCORRELATIVO
AND c.IDTRANCOBRO=d.IDTRANCOBRO
AND c.IDOFICINA =d.IDOFICINA
AND c.EMPRESA = d.EMPRESA
AND d.valor > 0


INSERT @SALDOS
SELECT
c.NOCORRELATIVOABONO,c.IDTRANCOBROABONO,c.IDOficinaAbono,c.EMPRESAAbono,
c.CUOTAABONO,c.cliente,c.tipocliente,
d.distribuidor,d.tipodeuda,d.noreferenciadeuda,
null,NULL,FECHAABONO,
d.moneda,d.tasacambio,null,0, c.valorabono,TipoCarteraAbono,0,
d.noreferenciadeuda,
d.estado,d.idsucursal

FROM DocsCobrarHisabonos c, @DOCSCOBRAR d
WHERE c.NOCORRELATIVO = d.NOCORRELATIVO
AND c.IDTRANCOBRO=d.IDTRANCOBRO
AND c.IDOFICINA =d.IDOFICINA
AND c.EMPRESA = d.EMPRESA
AND d.valor < 0


UPDATE @Saldos
SET
fechaDocumento = isnull(cuotas.fec,cuotas.fecult),
FECHAVENCIMIENTO = isnull(cuotas.fecv,cuotas.fecult),
fechaultimopago= cuotas.fecult,
Periodo = cuotas.peri,
Nocupon = cuotas.cupon,
estado = cuotas.estado,
idsucursal = cuotas.idsucursal

FROM @Saldos s, (SELECT cliente , cuota,
Max(fechaDocumento) fec,
max(FECHAVENCIMIENTO) fecv,
max(fechaultimopago) fecult,
Max(periodo) peri,
MAX(NOCUPON) CUPON,
max(estado) estado,
max(idsucursal) idsucursal,
idoficina,
empresa
FROM @Saldos
GROUP BY cliente , cuota,idoficina,empresa)
Cuotas
WHERE s.cliente = cuotas.cliente
AND s.cuota = cuotas.cuota
AND s.idoficina= cuotas.idoficina
AND s.empresa = cuotas.empresa

DECLARE @SaldosF TABLE
(TipoCartera char(5),
NoCorrelativo bigint,
IdtranCobro char(5),
IdOficina char(10),
Empresa smallint,
Cuota smallint,
Cliente char(20),
TipoCliente char(5),
TipoDeuda char(5) ,
ReferenciaDeuda char(20),
NoDocumento varchar(20),
Distribuidor char(20),
FechaDocumento datetime,
FechaVencimiento datetime,
FechaUltimoPago datetime,
moneda char(3),
TasaCambio numeric(14,7),
Periodo datetime,
Valor numeric(14,2) default 0,
Abonos numeric(14,2) default 0,
Saldo numeric(15,2)default 0,
EStado char(5),
NoCupon bigint,
Sucursal char(5),
prioridad smallint
)
INSERT @saldosf
SELECT c.TipoCartera, c.NoCorrelativo ,c.tranCobro
,c.IdOficina ,
c.Empresa , c.Cuota , c.Cliente ,
c.TipoCliente , c.TipoDeuda ,
c.ReferenciaDeuda ,
c.NoDocumento ,
c.Distribuidor ,
c.FechaDocumento ,
c.fechavencimiento ,
c.FechaUltimoPago ,
c.moneda ,
c.TasaCambio ,
c.Periodo ,
sum(c.Valor) valor ,
sum(c.Abonos) abonos ,
sum(c.valor + c.abonos)Saldo,
c.estado ,
c.NoCupon ,
c.idsucursal ,
0
FROM @SALDOS c
WHERE c.TipoCartera like @tipocartera
AND c.MONEDA = @moneda
GROUP BY c.TipoCartera,c.NoCorrelativo ,tranCobro
,c.IdOficina ,
c.Empresa , c.Cuota , c.Cliente ,
c.TipoCliente , c.TipoDeuda ,
c.tipodeuda , c.estado,c.idsucursal,
c.ReferenciaDeuda ,
c.NoDocumento,
c.Distribuidor ,
c.fechadocumento,c.FechaDocumento ,
c.FechaVencimiento ,
c.FechaUltimoPago,
c.moneda ,
c.TasaCambio , c.Periodo ,
c.NoCupon

Update @saldosf
set Prioridad = t1.PrioridadPago
from TransaccionesDocsCobrar t1,@saldosf t2
Where t2.idTranCobro = t1.IdtranCobro
AND t2.tipocartera = t1.TipoCartera



select @TipoCartera, NoCorrelativo, idTranCobro, IDOficina,
Empresa, cuota,
Cliente, Tipocliente, noDocumento,
TipoDeuda, ReferenciaDeuda, Distribuidor, Prioridad,
FechaDocumento, FechaVencimiento, fechaultimopago,
moneda ,
TasaCambio,
Periodo,
Valor, Abonos, Saldo ,estado,
'',
NoCupon, sucursal
from @saldosf
where Saldo <> 0



return
END


Quisiera poder optimizar este codigo, pero al estar dentro de una
funcion no puedo usar indices
de acuerdo..

y no puedo ponerlo en un proceso almacenado..
debe ser dentro de una funcion..lo saque de la funcion para que se pueda
ver ..
asi hago pruebas..


Alejandro Mesa escribió:
César Toledo,

Por que mejor no posteas el codigo?


AMB


"César Toledo" wrote:


lo que sucede es que es una variable TABLE porque esta dentro de una
funcion..
alli no puedo usar tablas temporales con create table..
esta funcion determina los saldos de unos documentos..
tengo que meterlos alli, y luego aplicarle los pagos.. para obtener los
saldos.

Por eso ha quedado de esa manera.
y para hacer el analisis de vencimiento hay que leer todos los registros
de la cartera.



Pedro escribió:

Es raro tener que insertar tantos registros en una variable table.
Dificilmente sea necesario.
No podrías aplicar las instrucciones de seleccion directamente a las tablas
involucradas ?

"César Toledo" escribió en el mensaje
news:


hola

Estoy trabajando con una funcion en sql server,
que declara una variable TABLE @saldos

y esta tabla tiene como 1,000,000 de filas

la funcion se toma 30 minutos en hacer el INSERT de esta tabla..
me podrian decir si al hacer DECLARE @saldos TABLE ( )
tengo que especificar una llave primaria non clustered.

Es posible hacerlo ?

a que se deberá que el insert se tarde tanto.

Gracias

César






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