** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - ¿SQL Lentas?
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerrado¿SQL Lentas?

 Responder Responder
Autor
Mensaje
Goliat2000 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 11/Noviembre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 318
Enlace directo a este mensaje Tema: ¿SQL Lentas?
    Enviado: 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.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 10485
Enlace directo a este mensaje Enviado: 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.

Access Aplicaciones
Tecsys.es
Arriba
Goliat2000 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 11/Noviembre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 318
Enlace directo a este mensaje Enviado: 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.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 10485
Enlace directo a este mensaje Enviado: 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.

Access Aplicaciones
Tecsys.es
Arriba
Goliat2000 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 11/Noviembre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 318
Enlace directo a este mensaje Enviado: 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.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable