Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimisation de la requête de navires sous charte #3438

Merged
merged 3 commits into from
Jul 26, 2024

Conversation

VincentAntoine
Copy link
Collaborator

Linked issues

@VincentAntoine VincentAntoine changed the title Vincent/optimize queries Optimisation des requêtes de l'application Jul 26, 2024
@VincentAntoine
Copy link
Collaborator Author

VincentAntoine commented Jul 26, 2024

En prod après une nuit de collecte de stats (donc peu d'utilisation, surtout des actions de la pipeline) :

Image

A ajuster ce soir après une journée d'utilisation plus intensive, mais on voit déjà qu'il y a un problème avec la requête

SELECT under_charter FROM last_positions [...]

qui est exécutée plus de 26 000 fois par heure (7 fois par seconde) et qui consomme au total 11 minutes de "temps de travail" de la BDD par heure.

Cette requête est appelée par le use case GetAllCurrentReportings qui boucle sur tous les reportings et fait un appel de cette requête à chaque fois.

De plus ou voit que la table last_positions est celle qui subit le plus de sequential scans et que le nombre de sequential scans correspond au nombre d'exécutions de cette requête :

Image

Le repository contenant la requête incriminée est :

interface DBLastPositionRepository : JpaRepository<LastPositionEntity, Int> {

    // [...]

    @Query(
        value = """
        SELECT under_charter
        FROM last_positions
        WHERE
            CASE
                WHEN :vesselIdentifier = 'INTERNAL_REFERENCE_NUMBER' THEN cfr
                WHEN :vesselIdentifier = 'IRCS' THEN ircs
                WHEN :vesselIdentifier = 'EXTERNAL_REFERENCE_NUMBER' THEN external_immatriculation
            END = :value
        """,
        nativeQuery = true,
    )
    fun findUnderCharterByVesselIdentifierEquals(vesselIdentifier: String, value: String): Boolean
}
  • Passer cette requête sur vessels plutôt que sur last_positions (permet de plus d'avoir des données sur les navires < 12m qui ne figurent pas dans last_positions
  • Modifier la requête pour assurer qu'elle exploite les index
  • Mettre un cache avec une expiration de ~1h sur le repository

Copy link

sonarcloud bot commented Jul 26, 2024

@VincentAntoine
Copy link
Collaborator Author

Update après un peu moins de 24h de stats d'usage des requêtes :

image

image

En journée l'utilisation accrue de l'appli entraîne une augmentation de la charge sur cette requête qui occupe la BDD quasiment 100% du temps!

@VincentAntoine VincentAntoine marked this pull request as ready for review July 26, 2024 15:20
Copy link
Member

@ivangabriele ivangabriele left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM mais on aurait pu même directement utiliser JpaVesselRepository.findVessel().

@VincentAntoine VincentAntoine merged commit 2245fb3 into master Jul 26, 2024
26 checks passed
@VincentAntoine VincentAntoine deleted the vincent/optimize_queries branch July 26, 2024 16:13
@VincentAntoine
Copy link
Collaborator Author

@louptheron je vois qu'il y avait un ticket lié aux perfs de cette requête #2362

Tu penses que ça reste nécessaire de remplacer la logique du use case pour faire un join plutôt qu'un forEach malgré l'optimisation faite dans ce ticket (passage sur la table vessels + optimisation de la requête pour exploiter les index + ajout d'un cache backend) ?

@VincentAntoine VincentAntoine changed the title Optimisation des requêtes de l'application Optimisation de la requête de navires sous charte Jul 29, 2024
@louptheron
Copy link
Collaborator

@louptheron je vois qu'il y avait un ticket lié aux perfs de cette requête #2362

Tu penses que ça reste nécessaire de remplacer la logique du use case pour faire un join plutôt qu'un forEach malgré l'optimisation faite dans ce ticket (passage sur la table vessels + optimisation de la requête pour exploiter les index + ajout d'un cache backend) ?

@VincentAntoine Bien joué pour l'optimisation, perso ça me semble suffisant : il y aura pas mal de requêtes toutes les 30 minutes, avec l'utilisation du cache, mais comme les index sont utilisés c'est OK.
On attend un nouveau rapport d'usage de la DB après la MEP et on avise ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Optimisation des requêtes
3 participants