While

31/10/2006 - 19:35 por Eduardo De Luca | Informe spam
Hola , que tal tengo el siguiente caso (esta resumido , ya que la
explicación funcional es muy extensa y no les quiero quemar la cabeza).

Tabla A

Mov_contable (money)

fecha (datetime)

cant_periodos (int)



Tabla B

Calculo_mov (money)

Fecha (date time)





En la tabla A puedo tener el sgte registro



10.00 31/10/2006 8



El ocho significa que tengo que insertar 8 veces un registro en la tabla B
aplicando un algoritmo financiero muy simple (lo aclaro porque aca no esta
el problema)





Yo pensé (siempre usando el ejemplo mencionado arriba)





Declare @counter int



Set @counter =cant_periodos from tabla A



While (@counter < 9)



Begin



Insert Tabla B ...



Set @counter=@counter + 1



end



el problema que se me presenta es de performace , ya que cuando lo valores
del WHILE son muy elevados se me va el tiempo al diablo .

Alguno me podría ayudar y se le ocurre otra forma de hacerlo?



Desde ya muchas gracias

Preguntas similare

Leer las respuestas

#6 Eduardo De Luca
31/10/2006 - 22:01 | Informe spam
El unico tema es que el valor ese es variable todos los dias
"Javier Loria" escribió en el mensaje
news:ut0j$zS$
Hola Eduardo:
Nop, una sola vez creas el ciclo en la tabla y nunca mas.
Pruebalo y veras que es por lo menos 100 veces mas rapido.
Saludos y suerte,

Javier Loria
Costa Rica-MVP
Solid Quality Learning

"Eduardo De Luca" wrote in message
news:%23mUt7XS$
GRacias , por tu ayuda. Pero en realidad si hago un ciclo estoy en lo
mismo que antes , en ves de hacer el ciclo en el insert lo hago en la
tabla "numeros" . Pensa que el ejemplo puse un 8 pero en la realidad son
valores muchos mas grandes , como 140000 o 200000 y a veces mas . Lo
probe y funciona perfecto tu ejemplo . Pero cuando hago el ciclo para
insertar la numeracion pasa lo mismo (la degradacion).
No se te ocurre otra forma ?

Desde ya muchas gracias

"Javier Loria" escribió en el mensaje
news:%23ehqpOS$
Hola Eduardo:
Algo como:
>>> CREATE TABLE Numeros(
Num INT NOT NULL PRIMARY KEY
)
>>> Luego la llenas con un ciclo un select, etc.Si son pocos numeros:
INSERT Numeros(Num)
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
..
SELECT n
>>> Si son muchos usa un ciclo.
Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning
"Eduardo De Luca" wrote in message
news:OiA5nHS$
Gracias Javier , tengo sql2000 cuando me decis llenas la tabla numeros
, como lo harias , es decir solo tengo el numero no los correlativos


"Javier Loria" escribió en el mensaje
news:%23h6Um2R$
Hola Eduardo:
Puedes usar el WITH para generar una tabla o usar una tabla de
numeros es muy facil:
Con with (SQL 2005):
=>>>>> WITH Numeros(Num)
AS
(
SELECT 1
UNION ALL
SELECT Num+1 FROM Numeros
WHERE Num<100
)
INSERT TablaB
SELECT ...
FROM TablaA
JOIN Numeros
ON TablaA.CantPeriodos<=Numeros.Num
=>>>>> En caso de no tener SQL2005 creas primero la tabla numeros, la llenas
y solo haces la ultima parte:
=>>>>> INSERT TablaB
SELECT ...
FROM TablaA
JOIN Numeros
ON TablaA.CantPeriodos<=Numeros.Num
=>>>>> Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning

"Eduardo De Luca" wrote in message
news:eKGQftR$




Hola , que tal tengo el siguiente caso (esta resumido , ya que la
explicación funcional es muy extensa y no les quiero quemar la
cabeza).

Tabla A

Mov_contable (money)

fecha (datetime)

cant_periodos (int)



Tabla B

Calculo_mov (money)

Fecha (date time)





En la tabla A puedo tener el sgte registro



10.00 31/10/2006 8



El ocho significa que tengo que insertar 8 veces un registro en la
tabla B aplicando un algoritmo financiero muy simple (lo aclaro
porque aca no esta el problema)





Yo pensé (siempre usando el ejemplo mencionado arriba)





Declare @counter int



Set @counter =cant_periodos from tabla A



While (@counter < 9)



Begin



Insert Tabla B ...



Set @counter=@counter + 1



end



el problema que se me presenta es de performace , ya que cuando lo
valores del WHILE son muy elevados se me va el tiempo al diablo .

Alguno me podría ayudar y se le ocurre otra forma de hacerlo?



Desde ya muchas gracias






















Respuesta Responder a este mensaje
#7 Alejandro Mesa
31/10/2006 - 22:16 | Informe spam
Eduardo,

Con el permiso de Javier (Hola), lo que el te quiere decir es que esta tabla
de numeros la crees una sola vez, que pongas cuantas filas necesites, quizas
un millon, y que la dejes como parte de tu db. Esta tabla auxiliar no consume
mucho espacio en disco y puede ser usada en un sin fin de aplicaciones.
Asegurate de crear un indice clustered por la columna que almacena el numero.

select identity(int, 1, 1) as numero
into dbo.numero
from sysobjects as a cross join sysobjects as b cross join sysobjects as c

alter table dbo.numero
add constraint pk_numero primary key clustered (numero) with fillfactor = 100
go


AMB


"Eduardo De Luca" wrote:

El unico tema es que el valor ese es variable todos los dias
"Javier Loria" escribió en el mensaje
news:ut0j$zS$
> Hola Eduardo:
> Nop, una sola vez creas el ciclo en la tabla y nunca mas.
> Pruebalo y veras que es por lo menos 100 veces mas rapido.
> Saludos y suerte,
>
> Javier Loria
> Costa Rica-MVP
> Solid Quality Learning
>
> "Eduardo De Luca" wrote in message
> news:%23mUt7XS$
>> GRacias , por tu ayuda. Pero en realidad si hago un ciclo estoy en lo
>> mismo que antes , en ves de hacer el ciclo en el insert lo hago en la
>> tabla "numeros" . Pensa que el ejemplo puse un 8 pero en la realidad son
>> valores muchos mas grandes , como 140000 o 200000 y a veces mas . Lo
>> probe y funciona perfecto tu ejemplo . Pero cuando hago el ciclo para
>> insertar la numeracion pasa lo mismo (la degradacion).
>> No se te ocurre otra forma ?
>>
>> Desde ya muchas gracias
>>
>> "Javier Loria" escribió en el mensaje
>> news:%23ehqpOS$
>>> Hola Eduardo:
>>> Algo como:
>>> > >>> CREATE TABLE Numeros(
>>> Num INT NOT NULL PRIMARY KEY
>>> )
>>> > >>> Luego la llenas con un ciclo un select, etc.Si son pocos numeros:
>>> INSERT Numeros(Num)
>>> SELECT 1 UNION ALL
>>> SELECT 2 UNION ALL
>>> SELECT 3 UNION ALL
>>> ..
>>> SELECT n
>>> > >>> Si son muchos usa un ciclo.
>>> Saludos,
>>>
>>> Javier Loria
>>> Costa Rica-MVP
>>> Solid Quality Learning
>>> "Eduardo De Luca" wrote in message
>>> news:OiA5nHS$
>>>> Gracias Javier , tengo sql2000 cuando me decis llenas la tabla numeros
>>>> , como lo harias , es decir solo tengo el numero no los correlativos
>>>>
>>>>
>>>> "Javier Loria" escribió en el mensaje
>>>> news:%23h6Um2R$
>>>>> Hola Eduardo:
>>>>> Puedes usar el WITH para generar una tabla o usar una tabla de
>>>>> numeros es muy facil:
>>>>> Con with (SQL 2005):
>>>>> => >>>>> WITH Numeros(Num)
>>>>> AS
>>>>> (
>>>>> SELECT 1
>>>>> UNION ALL
>>>>> SELECT Num+1 FROM Numeros
>>>>> WHERE Num<100
>>>>> )
>>>>> INSERT TablaB
>>>>> SELECT ...
>>>>> FROM TablaA
>>>>> JOIN Numeros
>>>>> ON TablaA.CantPeriodos<=Numeros.Num
>>>>> => >>>>> En caso de no tener SQL2005 creas primero la tabla numeros, la llenas
>>>>> y solo haces la ultima parte:
>>>>> => >>>>> INSERT TablaB
>>>>> SELECT ...
>>>>> FROM TablaA
>>>>> JOIN Numeros
>>>>> ON TablaA.CantPeriodos<=Numeros.Num
>>>>> => >>>>> Saludos,
>>>>>
>>>>> Javier Loria
>>>>> Costa Rica-MVP
>>>>> Solid Quality Learning
>>>>>
>>>>> "Eduardo De Luca" wrote in message
>>>>> news:eKGQftR$
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> Hola , que tal tengo el siguiente caso (esta resumido , ya que la
>>>>>> explicación funcional es muy extensa y no les quiero quemar la
>>>>>> cabeza).
>>>>>>
>>>>>> Tabla A
>>>>>>
>>>>>> Mov_contable (money)
>>>>>>
>>>>>> fecha (datetime)
>>>>>>
>>>>>> cant_periodos (int)
>>>>>>
>>>>>>
>>>>>>
>>>>>> Tabla B
>>>>>>
>>>>>> Calculo_mov (money)
>>>>>>
>>>>>> Fecha (date time)
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> En la tabla A puedo tener el sgte registro
>>>>>>
>>>>>>
>>>>>>
>>>>>> 10.00 31/10/2006 8
>>>>>>
>>>>>>
>>>>>>
>>>>>> El ocho significa que tengo que insertar 8 veces un registro en la
>>>>>> tabla B aplicando un algoritmo financiero muy simple (lo aclaro
>>>>>> porque aca no esta el problema)
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> Yo pensé (siempre usando el ejemplo mencionado arriba)
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> Declare @counter int
>>>>>>
>>>>>>
>>>>>>
>>>>>> Set @counter =cant_periodos from tabla A
>>>>>>
>>>>>>
>>>>>>
>>>>>> While (@counter < 9)
>>>>>>
>>>>>>
>>>>>>
>>>>>> Begin
>>>>>>
>>>>>>
>>>>>>
>>>>>> Insert Tabla B ...
>>>>>>
>>>>>>
>>>>>>
>>>>>> Set @counter=@counter + 1
>>>>>>
>>>>>>
>>>>>>
>>>>>> end
>>>>>>
>>>>>>
>>>>>>
>>>>>> el problema que se me presenta es de performace , ya que cuando lo
>>>>>> valores del WHILE son muy elevados se me va el tiempo al diablo .
>>>>>>
>>>>>> Alguno me podría ayudar y se le ocurre otra forma de hacerlo?
>>>>>>
>>>>>>
>>>>>>
>>>>>> Desde ya muchas gracias
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>
>



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