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 :

Indexer une table


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut Indexer une table
    Bonjour à tous,

    J'ai une requête update sur une table et elle rame quand je l'exécute, donc je souhaiterais faire intervenir les index.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Update Table1 tab1
    set col1 = (select distinct tab2.col1 from table2 tab2 where tab1.col3 = tab2.col3 and tab1.col4 = tab2.col4)
    set col2 = (select distinct tab2.col2 from table2 tab2 where tab1.col3 = tab2.col3 and tab1.col4 = tab2.col4)
    where tab1.status = 'NEW'
    and nvl(tab1.col6,0) = 1
    and exists (select 'x' from table2 tab2 where tab1.col3 = tab2.col3 and tab1.col4 = tab2.col4)
    Vous auriez une idée sur la disposition d'index?

    Je souligne que la table1 comporte plus de 2 millions de lignes contre 2000 pour la table 2.

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Déjà faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    Set (col1, col2) = (Select col1, col2
                                From ...
    Utilisez Merge si c'est possible.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Ok je vais le faire.

    Et merge me sort cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-30926 : impossible d'obtenir un ensemble de lignes stables dans les tables source

  4. #4
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Vous n'avez aucun index de défini ?

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    si j'ai mis un index sur : Status et sur nvl(tab1.col6,0).

    Voici ma requête avec le merge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    merge into tab1
                using tab2
                on (ltrim(rtrim(substr(tab1.LIGNE_ME,153,4))) = tab2.TRANRDJE 
                    and  ltrim(rtrim(substr(tab1.LIGNE_ME,157,4))) =  tab2.OPERRDJE)
                 when matched then update 
                 set   (ORIGINE,JOURNAL) = (select distinct CODORIG,CODJOU    from tab2 where ltrim(rtrim(substr(tab1.LIGNE_ME,153,4))) = tab2.TRANRDJE and  ltrim(rtrim(substr(tab1.LIGNE_ME,157,4))) = tab2.OPERRDJE)
    where tab1.status = 'NEW'
    and nvl(tab1.col6,0) = 1

  6. #6
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Je pense qu'un index sur tab1.col3 , tab2.col3 ou tab1.col4 , tab2.col4 (en fonction de la colonne la plus discriminante) peut etre envisagé.
    J'ai des doute quand a l'index sur tab1.col6

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par AbouZaid Voir le message
    ...
    Voici ma requête avec le merge :
    ...
    Merging into a Table: Example

  8. #8
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Citation Envoyé par AbouZaid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND nvl(tab1.col6,0) = 1
    tab1.col6 = 1 suffit, si avec cette condition col6 est null, il ne le prendra pas (pas besoin de lui affecter 0 pour s'apercevoir que 0 est différent de 1)
    La question restant... est ce que col6 est très sélective ?

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    non la colonne n'est pas très sélective...

  10. #10
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Dans ce cas, je te renvoie à la remarque de Yanika : il faut envisager de "partir" de la table tab2 qui a moins de lignes, afin d'éviter le scan des 50 millions de lignes.

    Par contre, comme ton lien sur les colonnes de la table1 utilise des fonctions, il faut envisager de créer un index sur les fonctions correspondantes :
    - trim(rtrim(substr(tab1.LIGNE_ME,153,4)))
    - ltrim(rtrim(substr(tab1.LIGNE_ME,157,4)))

    Avec la même question : ces valeurs sont elles sélectives ?

    A surveiller également si ces colonnes sont nullables...

Discussions similaires

  1. [MySQL-5.5] Comment indexer une table pour la fusionner
    Par Mordehai dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/03/2013, 11h24
  2. Réponses: 3
    Dernier message: 08/04/2011, 12h26
  3. indexer une table
    Par cam360 dans le forum SAP
    Réponses: 3
    Dernier message: 30/06/2008, 16h47
  4. Conseil pour Indexer une table DBase
    Par alainvh dans le forum Bases de données
    Réponses: 4
    Dernier message: 08/05/2006, 22h27
  5. Indexer une table
    Par localhost dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 27/02/2005, 13h49

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