Ver Mensaje Individual
  #6  
Antiguo 20-09-2022
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Reputación: 19
Angel.Matilla Va por buen camino
Gracias por las respuestas. En cuanto pueda las probaré. No obstante me he dado cuenta de que hay un error de sintaxis en el query: la línea
Código SQL [-]
AND RefInt LIKE '1%' OR RefInt LIKE '2%'
está mal escrita y debería ser:
Código SQL [-]
AND (RefInt LIKE '1%' OR RefInt LIKE '2%')
me faltaban los paréntesis.
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Puedes indicarle qué "plan" debe usar, mira esto.
También puedes cambiar el orden de las condiciones y demás para probar.
Aparte de eso supongo que (a simple vista) por cada registro debe hacer el "select distinct en recibos" por lo que eso lo ralentiza.
Habría que hacer diversas pruebas, por ejemplo, cambia el "not int" por "not exists".
Esa estructura de un SELECT no la conocía, pero ¿cómo sé que plan aplicar? Si yo ejecuto ese query tal como está me da esta información de ejecución:
Cita:
Plan:
------------------------------------------------
PLAN SORT ((RECIBOS NATURAL))
PLAN SORT ((RECIBOS NATURAL))
PLAN JOIN (B INDEX (FK_CODPERCUO), A INDEX (PK_PERSONA))
¿Cómo hago para forzar que use el índide que me interesa?
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Además del acceso por índice, yo intentaría evitar la clausula IN, porque suelen ser bantante lentas.
La mayoría de veces, se puede hacer lo mismo utilizando una JOIN. Revísalo.
Sí, lo sé, pero en este caso lo que necesito es que me encuentre los códigos que no estén ya en la tabla Recibos y no se me ocurre como reemplazar el IN por JOIN
Cita:
Empezado por chenech Ver Mensaje
En lugar de LIKE usa STARTING, tengo entendido por la documentación de Firebird que está mas optimizado y por lo que veo es lo que empieza por 1 o 2.
¡Increíble! Ha pasado de hacer ciento y pico millones de lecturas no indexadas a poco más de 30 mil indexadas. Muchas gracias a todos por la ayuda.
Responder Con Cita