Imprimir página | Cerrar ventana

¿SQL Lentas?

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84144
Fecha de impresión: 20/Abril/2019 a las 16:24


Tema: ¿SQL Lentas?
Publicado por: Goliat2000
Asunto: ¿SQL Lentas?
Fecha de publicación: 05/Diciembre/2018 a las 08:57

Buenos días estimados compañeros, quiero someter a vuestra consideración y consejo una consulta sobre unas líneas de código que, a mi parecer, tardan mucho en ejecutarse y por si entendierais vosotros si tiene posibilidad de optimización. Tengo un formulario huérfano (es decir, que no tiene tabla, consulta o registros subyacentes), en el cual en el Evento al Abrir, está colocado el código en cuestión. Son dos SQL de eliminación, una sobre la tabla Detalles de Pedido que, actualmente tiene unos 13.000 registros, y la otra sobre la tabla Pedidos que tiene unos 3.200 registros.

 La primera SQL borra todos los registros de detalles de pedido donde carezca de número de pedido o de código de identificación de producto.

La segúnda SQL marca como anulado los pedidos que no tengan detalles de pedido.

 Estas líneas, funcionan correctamente, pero tardan en ejecutarse conforme a estos datos:

Ordenador portátil HP Procesador Core i5 con Win 7 y Access 2003 (ya tiene algunos años el ordenador). Tarda 1 minuto

 Ordenador Lenovo (Notebook) es pequeño,  Procesador (ignoro el procesador), con win 10 y Access 2003 Tarda: 3 minutos

 Líneas de código:

 'Primero esta

    DoCmd.SetWarnings False

        DoCmd.RunSQL ("DELETE * FROM [tbDetallesPedido] WHERE (((tbDetallesPedido.IdPedido) Is Null)) OR (((tbDetallesPedido.IdProducto) Is Null));")

    Espera (1)

'Segundo esta otra

        DoCmd.RunSQL ("UPDATE tbPedidos SET tbPedidos.Anulado = True WHERE (((tbPedidos.IdPedido) Not In (SELECT DISTINCT IdPedido FROM [tbDetallesPedido])));")

    DoCmd.SetWarnings True

 

He buscado temas al respecto, porque sé que hay, pero lo que he encontrado no es válido para ésta cuestión. 

¿Cabe la posibilidad de ejecución más rápida mediante mejora de las líneas de código o en realidad es cuestión de los ordenadores y S.O. en los que se ejecuta?.

 Un saludo y buen día para todos.



-------------
Muchas gracias, aunque sólo lo hayas leído.



Respuestas:
Publicado por: Mihura
Fecha de publicación: 05/Diciembre/2018 a las 10:19
La primera debe ser inmediata ... (ojo a los indices en los campos IdPedido e IdProducto)

La segunda, tal como la has planteado TIENE que ser lenta. Yo cambiaría el planteamiento a relacionar el pedido con las líneas y seleccionaria aquellas líneas que tuvieran un campo de la línea de pedido = Null, es decir no existe la línea de pedido.

Si te deja actualizar ahí bien, pero si no te dejara  esa será la consulta de selección para un:

UPDATE PEDIDOS .... WHERE IdPedido IN (SELECT....)




-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Goliat2000
Fecha de publicación: 05/Diciembre/2018 a las 10:56
Gracias Mihura por contestar. No termino de entender tus indicaciones de "Yo cambiaría el planteamiento a relacionar el pedido con las líneas y seleccionaria aquellas líneas que tuvieran un campo de la línea de pedido = Null, es decir no existe la línea de pedido.". Por favor, ¿puedes aclararme algo más?. Gracias

-------------
Muchas gracias, aunque sólo lo hayas leído.


Publicado por: Mihura
Fecha de publicación: 05/Diciembre/2018 a las 11:24
Prueba esto:

SELECT CampoPedido, CampoLineaPedido PEDIDO LEFT JOIN LineasPedido ON .....

Verás como los pedidos que no tengan lineas de pedido el campo dependiente de la linea de pedido saldra como Null.




-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Goliat2000
Fecha de publicación: 05/Diciembre/2018 a las 12:18
Gracias. He probado lo siguiente, y creo que funciona y mucho más rápido. He probado en tener un pedido en la tabla pedidos huérfano de detalle de pedido (no hay ningún registro en la tabla detalles de pedido que tenga relación con el pedido huérfano), y desde luego, ha sido muy rápido.

DoCmd.RunSQL ("UPDATE tbPedidos LEFT JOIN tbDetallesPedido ON tbPedidos.IdPedido = tbDetallesPedido.IdPedido SET tbPedidos.Anulado = True" _
             & " WHERE (((tbDetallesPedido.IdPedido) Is Null) AND ((tbPedidos.Anulado)=False));")

Si es correcto, que yo creo que sí, se puede cerrar el hilo. Gracias nuevamente. Saludos



-------------
Muchas gracias, aunque sólo lo hayas leído.



Imprimir página | Cerrar ventana