Foros del Web » Programando para Internet » ASP Clásico »

Cuestión de eficiencia

Estas en el tema de Cuestión de eficiencia en el foro de ASP Clásico en Foros del Web. Desde un control permito seleccionar una serie de registros que luego se usan para saber sobre cuales hay que actuar y sobre cuales no. Suelen ...
  #1 (permalink)  
Antiguo 28/08/2002, 06:46
 
Fecha de Ingreso: abril-2002
Mensajes: 438
Antigüedad: 23 años
Puntos: 2
Cuestión de eficiencia

Desde un control permito seleccionar una serie de registros que luego se usan para saber sobre cuales hay que actuar y sobre cuales no. Suelen ser unos 6000 y si el usuario va marcando. Mi pregunta es cómo controlar los que ha marcado. Actualizar la BBDD con 6000 registros y un campo booleano tarda mucho pero luego es eficiente ya que me pemite hacer un where en el SQL atacando al valor de ese campo. Volvar los ID de los seleccionados a un vector es eficiente pero luego tengo que controlar para cada registro sobre el que actúo si el ID está en ese vector o no y aunque escoga uno de los muchos y eficientes métodos de búsqueda en vector se retrasa mucho.
¿A alguien se le ocurre otra manera?

Agradecería solución infinitamente.
Saludos.
  #2 (permalink)  
Antiguo 28/08/2002, 06:56
 
Fecha de Ingreso: abril-2002
Mensajes: 438
Antigüedad: 23 años
Puntos: 2
Re: Cuestión de eficiencia

Acabo de leer el mensaje y ni yo lo entiendo. Me explico mejor y perdón por las molestias:
Muestro un control con los datos de una tabla (tablaX) de la BBDD y permito al usuario seleccionar una serie de registros. Una vez todo está conforme le da al OK. Suelen ser unos 6000 registros y se suelen seleccionar de 0 a 100. Después de dar al OK se lanza un proceso ya de por sí largo en el que se actualizan muchas tablas (demasiadas). Antes se tenían en cuenta todos los datos de tablaX, pero ahora deben tenerse en cuenta sólo los seleccionados.
Posibilidad campo booleano: es muy lento hacer un update de 6000 registros, pero luego está muy bien ya que en la consulta me permite hacer un where sobre ese campo y me traigo sólo los registros seleccionados.
Posibilidad vector: es muy rápido en un primer momento, pero luego para cada producto de tablaX he de ver si su ID está en el vector o no para traérmelo o no.
Posibilidad 3: es la que espero me aconsejéis ya que no me convencen ninguna de las otras dos.

Saludos.



  #3 (permalink)  
Antiguo 28/08/2002, 07:06
 
Fecha de Ingreso: agosto-2002
Ubicación: Barcelona
Mensajes: 29
Antigüedad: 22 años, 8 meses
Puntos: 1
Re: Cuestión de eficiencia

La verdad es que no se que tipo de actualización o modificación tienes que hacer exactamente en la BBDD pero por ejemplo veamos un ejemplo básico:

(Borrado de todos los registros que he marcado)

Si en el formulario tengo los checkbox con el mismo nombre y en su value el Identificador consigo coger en una variable todos esos valores... veamos un código:

<input type="checkbox" name="IDSeleccionados" value="1">
<input type="checkbox" name="IDSeleccionados" value="2">
<input type="checkbox" name="IDSeleccionados" value="3">
<input type="checkbox" name="IDSeleccionados" value="4">
.
.
.

Esto en el ASP cuando haces un request de IDSeleccionados te devuelve los que haya marcado 1,3,6 ...

y en la consulta a la BD puedes hacer lo siguiente.

"DELETE FROM Tabla WHERE ID IN (" & request("IDSeleccionados") & ")"

No se si te ayudo o te doy alguna pista más aunque ten en cuenta una cosa si tienes que hacer un tratamiento especial por registro o sea que no es un borrado o una modificación masiva todo procedimiento que hagas será lento.

Ya me dirás algo. ;)


<br>
Juanan
  #4 (permalink)  
Antiguo 28/08/2002, 08:47
 
Fecha de Ingreso: enero-2002
Mensajes: 1.438
Antigüedad: 23 años, 3 meses
Puntos: 0
Re: Cuestión de eficiencia

extraido del tutorial de sql:

UPDATE es especialmente útil cuando se desea cambiar un gran número de registros o cuando éstos se encuentran en múltiples tablas.

Puede cambiar varios campos a la vez. El ejemplo siguiente incrementa los valores Cantidad pedidos en un 10 por ciento y los valores Transporte en un 3 por ciento para aquellos que se hayan enviado al Reino Unido.:

UPDATE Pedidos SET Pedido = Pedidos * 1.1, Transporte = Transporte * 1.03
WHERE PaisEnvío = 'ES'

si dices q es un booleano, podrias hacer algo asi:

UPDATE tabla SET campo = TRUE WHERE ID IN (&quot; &amp; request(&quot;IDSeleccionados&quot;) &amp; &quot;)&quot;

tal como te explican antes.
de esta forma solo realizas una consulta a la tabla.

Si como dices tienes varias tablas tendras q currarte un poc mas las condiciones de WHERE o los campos del SET
  #5 (permalink)  
Antiguo 28/08/2002, 12:14
 
Fecha de Ingreso: abril-2002
Mensajes: 438
Antigüedad: 23 años
Puntos: 2
Re: Cuestión de eficiencia

Hola a los dos,

Os cuento más detallado: son sucursales y para cada sucursal hay que elaborar una hoja Excel con datos de productos y otra serie de tablas, pero en lo que es crítico es en el número de productos que se procesa (pensad que hay que tratar unas 200 sucursales con lo cual el número de productos influye mucho en el tiempo de generación del los .xls). Antes se hacía tratando con todos, ahora he de dar la opción de elegir unos cuantos. No puedo hacer un update general con un IN, ya que eso dejaría los anteriores marcados, es decir, si eligo la opción del nuevo campo deberé hacer 6000 updates obligatoriamente, así que por ahí no van los tiros. Como me convence mucho más la posibilidad de la BBDD que la del vector, en eso os doy la razón, he estado pensando y creo que me voy a decantar (ya me diréis que os parece) por un borrado del campo en la tabla, posterior inserción del campo de nuevo y update con los productos seleccionados dejando el resto al valor NULL original.
Algo del palo:

txtSQL = &quot;alter table MITABLA drop ELCAMPO;&quot;
Db.Execute txtSQL, dbSQLPassThrough
txtSQL = &quot;alter table MITABLA add column ELCAMPO integer;&quot;
Db.Execute txtSQL, dbSQLPassThrough

Paso de hacer 6000 updates a hacer entre 0 y 100, he hecho pruebas y la verdad es que funciona mucho más rápido.

Ya decís algo.
Muchas gracias a ambos.


Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:27.