CONSEJO CON CURSOR

10/08/2004 - 17:24 por Ale | Informe spam
Buenas tardes/dias/noches :P gente
Yo tengo que recorrer una tabla e ir haciendo unas
operaciones. Lo mas facil es abrir un cursor, lo cual no
es muy recomendado,
por lo que se me ocurrio ir recorriendo al tabla e ir
haciendo SELECT TOP 1 y voy guardando los valores que
necesito en variables
(algo similar al FETCH NEXT de un cursor) y luego marco el
registro para no volver a seleccionarlo.

La pregunta es la siguiente, siempre me conviene evitar el
uso del cursor? el trabajo que realizo es menos costoso
que recorer el cursor?

Espero que quede claro
Saludos y gracias de ante mano.

Preguntas similare

Leer las respuestas

#6 Javier Loria
10/08/2004 - 21:15 | Informe spam
Hola:
Esa es una "buena" razon para usar un cursor, ya que durante mucho
tiempo cuando se requeria este tipo de acceso se recomendaban, pero los
dba's han popularizado muchas tecnicas para no requerirlos.
Por ultimo, por suspuesto que se puede, si nos das el ejemplo podemos
tratar de resolverlo. Hay muchos participantes que son expertos en SQL y que
estaran mas que dispuestos a matar un cursor.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

wrote in message
news:38cd01c47f01$f12f24b0$
EL tema es el siguiente y espero que se entienda pq es
algo complejo.
Es muy dificil de explicarlo, ya que no los quiero aburrir
y tambien quiero que lo lean y que opinen.

En una tabla tengo una serie de registros, donde tengo que
aplicar una formula para el primero, y el resultado de esa
formula, se aplica al proximo registro, y asi
sucesivamente se va arrastrando el resultado por registro,
pero no en todos los casos.
Si no se entiende, les hago un ejemplo(si es que se puede).

Slds. y gracias


>Hola Ale:
> Lo que propones (SELECT TOP 1) es tan malo como un
cursor. :(
> Evita el cursor y evita el SELECT TOP 1, trata de
hacer las
>"transformaciones" en las mismas columnas.
> Si nos das un poco mas de detalle de lo que quieres
hacer con gusto te
>ayudamos.
> Saludos,
>
>Javier Loria
>Costa Rica
>Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>que pueda ser copiado y pegado al Query Analizer.
>La version de SQL y Service Pack tambien ayuda
>
>"Ale" wrote in
message
>news:387e01c47eee$309c1c70$
>> Buenas tardes/dias/noches :P gente
>> Yo tengo que recorrer una tabla e ir haciendo unas
>> operaciones. Lo mas facil es abrir un cursor, lo cual no
>> es muy recomendado,
>> por lo que se me ocurrio ir recorriendo al tabla e ir
>> haciendo SELECT TOP 1 y voy guardando los valores que
>> necesito en variables
>> (algo similar al FETCH NEXT de un cursor) y luego marco
el
>> registro para no volver a seleccionarlo.
>>
>> La pregunta es la siguiente, siempre me conviene evitar
el
>> uso del cursor? el trabajo que realizo es menos costoso
>> que recorer el cursor?
>>
>> Espero que quede claro
>> Saludos y gracias de ante mano.
>>
>
>
>.
>
Respuesta Responder a este mensaje
#7 Javier Loria
10/08/2004 - 21:17 | Informe spam
Hola:
No es que TOP 1 sea "tan malo" pero me parecio que la propuesta de hacer
un CICLO DE TOP 1 es basicamente programar un cursor a mano. Los cursores
son ciclos que recorren fila por fila, y me parece que es lo mismo que esta
proponiendo o estoy equivocado?
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

wrote in message
news:3b3101c47f0c$eca57ce0$
A ver.. en que medida es lo mismo usar "SELECT TOP 1" que
un CURSOR? y por que es malo el TOP 1?
Si el TOP 1 es de una tabla Temporal que no tiene mas de
365 registros?

Saludos

>Buenas tardes/dias/noches :P gente
> Yo tengo que recorrer una tabla e ir haciendo unas
>operaciones. Lo mas facil es abrir un cursor, lo cual no
>es muy recomendado,
>por lo que se me ocurrio ir recorriendo al tabla e ir
>haciendo SELECT TOP 1 y voy guardando los valores que
>necesito en variables
>(algo similar al FETCH NEXT de un cursor) y luego marco
el
>registro para no volver a seleccionarlo.
>
>La pregunta es la siguiente, siempre me conviene evitar
el
>uso del cursor? el trabajo que realizo es menos costoso
>que recorer el cursor?
>
>Espero que quede claro
>Saludos y gracias de ante mano.
>
>.
>
Respuesta Responder a este mensaje
#8 Miguel Egea
10/08/2004 - 21:25 | Informe spam
Te propongo que revises este código y un trozido de tunning que le he hecho
a vuela pluma para mejorar algo el rendimiento si hubiesen muchísimos
registros.

En casos similares, vistas indexadas podrían dar un rendimiento magnífico.
En este en concreto que yo propongo, y sin haber profundizado mucho en el
estudio, creo que no mejorarían significativamente el rendimiento.

use northwind
go
set statistics io on
select customerid,freight,
(Select Sum(Freight)
From orders o
where o.customerid<=orders.customerid
and o.orderid<=orders.orderid)
from orders order by customerid,orderid
/* resultado
(830 row(s) affected)
Table 'Orders'. Scan count 831, logical reads 9559, physical reads 0,
read-ahead reads 0.
*/

create index ix_adhoc_order_index on orders (orderid,customerid,freight)
/*(830 row(s) affected)
Table 'Orders'. Scan count 831, logical reads 2459, physical reads 0,
read-ahead reads 0.
*/


-
Miguel Egea Gómez
Microsoft SQL-Server MVP
Webmaster de PortalSql.Com
¿Te interesa participar en las reuniones
del grupo de Usuarios de SQL-Server y .NET
Se harán en levante de España, (Alicante o Murcia)?

escribió en el mensaje
news:38cd01c47f01$f12f24b0$
EL tema es el siguiente y espero que se entienda pq es
algo complejo.
Es muy dificil de explicarlo, ya que no los quiero aburrir
y tambien quiero que lo lean y que opinen.

En una tabla tengo una serie de registros, donde tengo que
aplicar una formula para el primero, y el resultado de esa
formula, se aplica al proximo registro, y asi
sucesivamente se va arrastrando el resultado por registro,
pero no en todos los casos.
Si no se entiende, les hago un ejemplo(si es que se puede).

Slds. y gracias


>Hola Ale:
> Lo que propones (SELECT TOP 1) es tan malo como un
cursor. :(
> Evita el cursor y evita el SELECT TOP 1, trata de
hacer las
>"transformaciones" en las mismas columnas.
> Si nos das un poco mas de detalle de lo que quieres
hacer con gusto te
>ayudamos.
> Saludos,
>
>Javier Loria
>Costa Rica
>Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>que pueda ser copiado y pegado al Query Analizer.
>La version de SQL y Service Pack tambien ayuda
>
>"Ale" wrote in
message
>news:387e01c47eee$309c1c70$
>> Buenas tardes/dias/noches :P gente
>> Yo tengo que recorrer una tabla e ir haciendo unas
>> operaciones. Lo mas facil es abrir un cursor, lo cual no
>> es muy recomendado,
>> por lo que se me ocurrio ir recorriendo al tabla e ir
>> haciendo SELECT TOP 1 y voy guardando los valores que
>> necesito en variables
>> (algo similar al FETCH NEXT de un cursor) y luego marco
el
>> registro para no volver a seleccionarlo.
>>
>> La pregunta es la siguiente, siempre me conviene evitar
el
>> uso del cursor? el trabajo que realizo es menos costoso
>> que recorer el cursor?
>>
>> Espero que quede claro
>> Saludos y gracias de ante mano.
>>
>
>
>.
>
Respuesta Responder a este mensaje
#9 Ale
10/08/2004 - 22:32 | Informe spam
Creo que diste justo con el dedo en la tecla.
Muy buen ejemplo, ahora mismo voy a ver como lo puedo
adaptar.
Igualmente se siguen recibiendo ejemplos :P

Saludos y gracias a todos


Te propongo que revises este código y un trozido de


tunning que le he hecho
a vuela pluma para mejorar algo el rendimiento si


hubiesen muchísimos
registros.

En casos similares, vistas indexadas podrían dar un


rendimiento magnífico.
En este en concreto que yo propongo, y sin haber


profundizado mucho en el
estudio, creo que no mejorarían significativamente el


rendimiento.

use northwind
go
set statistics io on
select customerid,freight,
(Select Sum(Freight)
From orders o
where o.customerid<=orders.customerid
and o.orderid<=orders.orderid)
from orders order by customerid,orderid
/* resultado
(830 row(s) affected)
Table 'Orders'. Scan count 831, logical reads 9559,


physical reads 0,
read-ahead reads 0.
*/

create index ix_adhoc_order_index on orders


(orderid,customerid,freight)
/*(830 row(s) affected)
Table 'Orders'. Scan count 831, logical reads 2459,


physical reads 0,
read-ahead reads 0.
*/


-
Miguel Egea Gómez
Microsoft SQL-Server MVP
Webmaster de PortalSql.Com
¿Te interesa participar en las reuniones
del grupo de Usuarios de SQL-Server y .NET
Se harán en levante de España, (Alicante o Murcia)?

escribió en el


mensaje
news:38cd01c47f01$f12f24b0$
EL tema es el siguiente y espero que se entienda pq es
algo complejo.
Es muy dificil de explicarlo, ya que no los quiero




aburrir
y tambien quiero que lo lean y que opinen.

En una tabla tengo una serie de registros, donde tengo




que
aplicar una formula para el primero, y el resultado de




esa
formula, se aplica al proximo registro, y asi
sucesivamente se va arrastrando el resultado por




registro,
pero no en todos los casos.
Si no se entiende, les hago un ejemplo(si es que se




puede).

Slds. y gracias


>Hola Ale:
> Lo que propones (SELECT TOP 1) es tan malo como un
cursor. :(
> Evita el cursor y evita el SELECT TOP 1, trata de
hacer las
>"transformaciones" en las mismas columnas.
> Si nos das un poco mas de detalle de lo que quieres
hacer con gusto te
>ayudamos.
> Saludos,
>
>Javier Loria
>Costa Rica
>Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>que pueda ser copiado y pegado al Query Analizer.
>La version de SQL y Service Pack tambien ayuda
>
>"Ale" wrote in
message
>news:387e01c47eee$309c1c70$
>> Buenas tardes/dias/noches :P gente
>> Yo tengo que recorrer una tabla e ir haciendo




unas
>> operaciones. Lo mas facil es abrir un cursor, lo




cual no
>> es muy recomendado,
>> por lo que se me ocurrio ir recorriendo al tabla e ir
>> haciendo SELECT TOP 1 y voy guardando los valores que
>> necesito en variables
>> (algo similar al FETCH NEXT de un cursor) y luego




marco
el
>> registro para no volver a seleccionarlo.
>>
>> La pregunta es la siguiente, siempre me conviene




evitar
el
>> uso del cursor? el trabajo que realizo es menos




costoso
>> que recorer el cursor?
>>
>> Espero que quede claro
>> Saludos y gracias de ante mano.
>>
>
>
>.
>




.

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