IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Optimisation de requête


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 20
    Par défaut Optimisation de requête
    Bonjour,

    La table DD01405_COMPETENCE fait plus de 500 millions de lignes.

    Cette requête prend 3 heures, savez-vous comment je peux l'optimiser ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT ID_RCI ||'¥' ||ID_COMPETENCE||'¥' ||REPLACE(REPLACE(LIBELLE_COMPETENCE,CHR(10),' '),CHR(13),' ')||'¥' ||TYPE||'¥' ||CODE||'¥' ||
    TO_CHAR(DATE_AJOUT,'DD/MM/YYYY HH24:MI:SS')||'¥' ||CODE_STATUT||'¥' ||CODE_NIVEAU||'¥' ||ORIGINE_DONNEE||'¥' ||VISIBILITE_DONNEE||'¥' ||
    CODE_ACTEUR||'¥' ||CODE_ORIGINE||'¥' ||TO_CHAR(DATE_MODIFICATION,'DD/MM/YYYY HH24:MI:SS')||'¥' ||TO_CHAR(DATE_VALIDITE,'DD/MM/YYYY HH24:MI:SS')||
    '¥' ||(SELECT LISTAGG(LST.ID_EL,',') WITHIN GROUP(ORDER BY LST.ID_EL) CSV 
    FROM JSON_TABLE(NVL(JSON_LIAISON,'{}'), '$.experiences[*]' COLUMNS ( "ID_EL" PATH '$.id')) LST) ||'¥' ||(SELECT LISTAGG(LST.ID_EL,',') 
    WITHIN GROUP(ORDER BY LST.ID_EL) CSV FROM JSON_TABLE(NVL(JSON_LIAISON,'{}'), '$.formations[*]' COLUMNS ( "ID_EL" PATH '$.id')) LST) ||'¥' ||(SELECT LISTAGG(LST.ID_EL,',') 
    WITHIN GROUP(ORDER BY LST.ID_EL) CSV FROM JSON_TABLE(NVL(JSON_LIAISON,'{}'), '$.cartesvisite[*]' COLUMNS ( "ID_EL" PATH '$.id')) LST) ||'¥' 
    AS LIGNE_COMPETENCE 
    FROM DD01405_COMPETENCE
    Merci !

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    Il faudrait poster la structure des tables impliquées, y compris index etc pour avoir un début de réponse et des suggestions.
    Juste par curiosité, combien de lignes retourne cette requête, sur les 500 millions que contient la table DD01405_COMPETENCE ?

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par binarygirl Voir le message
    Il faudrait poster la structure des tables impliquées, y compris index etc pour avoir un début de réponse et des suggestions.
    Juste par curiosité, combien de lignes retourne cette requête, sur les 500 millions que contient la table DD01405_COMPETENCE ?
    Il n'y a pas de WHERE clause… çà devrait répondre à la question.
    Une optimisation serait d'avoir un seul JSON_TABLE dans une clause WITH au lieu de 3 subselect.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    J'ai quand même envie de savoir à quoi ressemblerait le résultat final et quel est le but de la manoeuvre. Si c'est pour tirer la totalité de la table, alors il ne faut pas s'étonner que ça prenne du temps Le volume de données peut être conséquent et prendre du temps à être transféré via le réseau, quand bien même la requête en elle-même serait rapide. Mais alors il faut se demander pourquoi on tirer la totalité, plutôt qu'un échantillon filtré.

    Pour trouver les goulets d'étranglement, il faut faire tourner un plan d'exécution, à défaut un moyen encore plus rudimentaire est de virer tout ce qui est subselect, jointures, fonctions d'aggrégation et voir combien de temps prend la requête, puis rajouter morceau par morceau, retester et voir là où les temps de réponse deviennent inacceptables.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 20
    Par défaut
    Le résultat final de la manœuvre est l'extraction de données dans un fichier pour être travaillé via d'autre batch. Ce petit bout de requête est l'extraction d'un script de batch que j'ai extrait suite à des rapports AWR et ADDM et qui fait partie du "TOP SQL statements".
    J'ai essayé d'améliorer les temps de perf avec du tuning Oracle (SGA, cache) mais je suis au max. Donc je demande des conseils si possible pour améliorer cette requête. Mais je ne suis pas developpeur SQL (enfin très peu).

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Bonjour,

    Pas de clause WHERE, et des requêtes scalaires qui font du JSON sur chacune des 500 millions de ligne, je doute qu'on puisse faire grand chose. Peut-être faire la requête avec un hint PARALLEL, et encore je ne suis pas sûr que ça fonctionne étant donné le JSON dans la SELECT list.
    Il faudrait que tu voies si ces données sont filtrées plus tard sur certains critères, auquel cas tu pourrais les appliquer déjà dans la requête.

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo