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 :

Désactiver Index context d'une partition


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Par défaut Désactiver Index context d'une partition
    Bonjour,

    Je dois faire un insert ( 2.5M de lignes) dans une table partitionné. Dans mon insert je précise le nom de la partition.

    Ma question est simple, pour que mon insert soit plus rapide, peut-on désactiver les indexes context de cette partition ( et seulement cette partition), faire mon insert puis remettre l'index ?

    Merci D'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Tu as une autre solution :
    Faire une une copie de ta partition sur une table temporaire de même structure (y compris les contraintes et index !)
    Insérer tes données dans la table temporaire.
    Désactiver les contraintes sur la table cible.
    Echanger ta partition et la table temporaire (y compris les index).
    Réactiver les contraintes sur la table cible.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre confirmé
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Par défaut
    Merci bien pour l'aide.

    je viens de trouver ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Unusable Local Indexes
     
    ALTER TABLE  [schema.]table MODIFY PARTITION partition UNUSABLE LOCAL INDEXES
     
    Marks the index partition corresponding to the given table partition UNUSABLE. You might mark an index partition unusable before you rebuild the index partition as described in Rebuild Unusable Local Indexes.
     
    If the index partition is not marked unusable, the rebuild command returns without actually rebuilding the local index partition.
     
    Rebuild Unusable Local Indexes
     
    ALTER TABLE  [schema.]table MODIFY PARTITION partition REBUILD UNUSABLE LOCAL
    INDEXES
    je vais tester et regarder les perf. Si ce n'est pas bon je prendrais ta solution qui est assez simple aussi.

    Merci

  4. #4
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Citation Envoyé par attila771 Voir le message
    Bonjour,

    Je dois faire un insert ( 2.5M de lignes) dans une table partitionné. Dans mon insert je précise le nom de la partition.

    Ma question est simple, pour que mon insert soit plus rapide, peut-on désactiver les indexes context de cette partition ( et seulement cette partition), faire mon insert puis remettre l'index ?

    Merci D'avance
    Si j'ai bien compris votre question, alors oui vous pouvez mettre les indexes locaux (partitionés) dans un statut unusable et les rebuilder par la suite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    mhouri.world > create table TAB1 ( Value number(10))
      2    partition by range(value)
      3    (
      4    partition p1 values less than (10),
      5    partition p2 values less than (20),
      6    partition p3 values less than (30),
      7    partition p4 values less than (40),
      8    partition p5 values less than (50)
      9    );
     
    Table created.
     
    mhouri.world > insert into tab1 select rownum from dual connect by rownum < 50;
     
    49 rows created.
     
    mhouri.world > commit;
     
    Commit complete.
     
    mhouri.world > create index tab1_indx1 on tab1(value) local;
     
    Index created.
     
    mhouri.world > alter index tab1_indx1 modify partition p1 unusable;
     
    Index altered.
     
    mhouri.world >select index_name, partition_name,status
      2  from user_ind_partitions
      3  where index_name = 'TAB1_INDX1';
     
    INDEX_NAME                     PARTITION_NAME                 STATUS            
    ------------------------------ ------------------------------ --------          
    TAB1_INDX1                     P1                             UNUSABLE          
    TAB1_INDX1                     P2                             USABLE            
    TAB1_INDX1                     P3                             USABLE            
    TAB1_INDX1                     P4                             USABLE            
    TAB1_INDX1                     P5                             USABLE            
     
    mhouri.world > alter index tab1_indx1 rebuild partition p1
      2  ;
     
    Index altered.
     
    mhouri.world > select index_name, partition_name,status
      2  from user_ind_partitions
      3  where index_name = 'TAB1_INDX1';
     
    INDEX_NAME                     PARTITION_NAME                 STATUS            
    ------------------------------ ------------------------------ --------          
    TAB1_INDX1                     P1                             USABLE            
    TAB1_INDX1                     P2                             USABLE            
    TAB1_INDX1                     P3                             USABLE            
    TAB1_INDX1                     P4                             USABLE            
    TAB1_INDX1                     P5                             USABLE
    Mohamed Houri

  5. #5
    Membre confirmé
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Par défaut
    Désole de réouvrir le sujet.

    J'ai un petit problème quand je désactive les index et je lance mon insert


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ALTER TABLE  MA_TABLE MODIFY PARTITION PARTITION350  UNUSABLE LOCAL INDEXES;
     
     
    INSERT INTO MA_TABLE (ID,col1,col2,col3,col4,col5) VALUES (200000221283,200000221283,'product',' Philippines','en',341);
     
     
    ALTER TABLE  MA_TABLE MODIFY PARTITION PARTITION350 REBUILD UNUSABLE LOCAL INDEXES;
    J'ai cette erreur lors de l'insert

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Error report:
    SQL Error: ORA-29954: domain index partition is marked LOADING/FAILED/UNUSABLE
    29954. 00000 -  "domain index partition is marked LOADING/FAILED/UNUSABLE"
    *Cause:    An attempt has been made to access a domain index that is
               being built or is marked failed by an unsuccessful DDL
               or is marked unusable by a DDL operation.
    *Action:   Wait if the specified index partition is marked LOADING
               Rebuild the specified index partition if it is marked FAILED
               or UNUSABLE.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Quand vous dites que vous faites un insert, vous faites l'insert d'une seule ligne ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Par défaut
    Pour faire mon test oui mais le vrai insert est une simple jointure qui fait 2.5M d'insert et qui prend beaucoup de temps


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    insert into MA_TABLE
    SELECT ID_SEQUENCE.NEXTVAL,a.* from (
    SELECT DISTINCT AA.METADATA_GROUP_ID,'blabla' AS NAME, B.RIGHT_TYPE AS VALUE,'en' AS LANGUAGE,'343' AS P#
    FROM MA_TABLE1 B
    INNER JOIN MA_TABLE2 AA ON AA.RESOURCE_ID=B.RESOURCE_ID
    WHERE B.RIGHT_TYPE IS NOT NULL
    AND NOT EXISTS ( SELECT 1 FROM AMN_METADATA AM WHERE AM.METADATA_GROUP_ID=AA.METADATA_GROUP_ID AND AM.NAME='blabla' AND AM.P#='343'))A

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Me voila rassuré, j'ai eu un doute en lisant votre exemple justement.

    Avez-vous essayé de faire un insert direct load avec le hint APPEND ?
    Cette syntaxe permet de créer de minis-index sur les nouvelles données, ces index étant fusionnés à la fin dans les existants :
    http://asktom.oracle.com/pls/asktom/...32800346479086
    Citation Envoyé par Tomas Kyte
    if you direct path load, you'll maintain indexes - we build mini indexes on the newly loaded data and merge them into the 'real' indexes in bulk. A direct path load of large amounts of data will maintain indexes very efficiently.
    Sinon je ne pense pas que ça ait un impact majeur sur votre requête, mais vous pouvez remonter les constantes d'un niveau.
    Au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    INSERT /*+ APPEND */ INTO MA_TABLE
    With A as
    (
    SELECT DISTINCT
           AA.METADATA_GROUP_ID
         , B.RIGHT_TYPE AS VALUE
      FROM MA_TABLE1 B
           INNER JOIN MA_TABLE2 AA
             ON AA.RESOURCE_ID = B.RESOURCE_ID
     WHERE B.RIGHT_TYPE IS NOT NULL
       AND NOT EXISTS (SELECT 1
                         FROM AMN_METADATA AM
                        WHERE AM.METADATA_GROUP_ID = AA.METADATA_GROUP_ID
                          AND AM.NAME = 'blabla'
                          AND AM."P#" = '343')
    )
    SELECT ID_SEQUENCE.NEXTVAL
         , METADATA_GROUP_ID
         , 'blabla'
         , VALUE
         , 'en'
         , '343'
      FROM A;

  9. #9
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Avez-vous essayé de faire un insert direct load avec le hint APPEND ?
    Cette syntaxe permet de créer de minis-index sur les nouvelles données, ces index étant fusionnés à la fin dans les existants :
    http://asktom.oracle.com/pls/asktom/...32800346479086
    Le direct path load est une bonne option sauf que le hint /*+ append */ est silencieusement ignoré par Oracle lorsque la table destinatrice de l'insert
    (a) possède un trigger
    ou
    (b) une foreign key

    De plus, le direct path load insert directement au dessus du High water mark. Il n'utilise aucun espace libre disponible. C'est pourquoi lorsque vous avez des deletes reguliers sur votre table le direct path n'est pas recommandé.

    Bien à vous

    Mohamed Houri

  10. #10
    Membre confirmé
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Par défaut
    Merci pour votre réponse mais hélas cela ne fonctionne pas

    J'ai voulu faire la méthode de al1_24 mais il s'avère que j'ai 2 index global sur ma table donc au final je fais le mouv de partition mais je me retrouve a refaire quand même 2 index...

    Je continue ma recherche !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2008] Désactiver le traitement pour une partition
    Par dream_rachid dans le forum SSAS
    Réponses: 2
    Dernier message: 25/07/2011, 15h48
  2. chercher l'index maxi d'une table
    Par picoti2 dans le forum Bases de données
    Réponses: 13
    Dernier message: 22/03/2004, 08h07
  3. [Débutant][Application web] : context d'une page JSP
    Par silver_dragoon dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/02/2004, 11h53
  4. Accéder à une partition HPFS
    Par Krashtest dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 14/11/2003, 10h16
  5. [Debutant]contexte d'une Webapp servlet et jsp
    Par yahia dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 13/10/2003, 10h43

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