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 :

Table super lente d'accès


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut Table super lente d'accès
    Bonjour,

    je suis sur une base 9i et j'ai un problème avec une de mes tables. Cette table est super lente d'accès: par exemple quand je fais un count(*) sur cette table elle met 4 minutes pour me retourner 99 019 lignes alors que si je fais un count(*) sur une table beaucoup plus grosse (1 millions de lignes), c'est quasi-instantanée.

    Quelle peut être la cause du problème?

    merci de votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    définition de la table ?
    Y a des indexes dessus ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    voici la définition de la table:
    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
     
    CREATE TABLE TCALC_GARANTIE
    (
      GAR_ID                          NUMBER,
      CLI_CODE                        NUMBER,
      ENT_ID                          NUMBER,
      CNC_TYPE                        CHAR(1 BYTE),
      DEV_CODE_MNT_INIT               CHAR(3 BYTE),
      PAY_CODE                        CHAR(2 BYTE),
      PAY_CODE_PARENT                 CHAR(2 BYTE),
      TYPE_GARANTIE                   CHAR(1 BYTE),
      GAR_IND_TYPE                    CHAR(1 BYTE),
      GAR_MNT_EURO                    NUMBER,
      GAR_PRC_ENCOURS                 NUMBER,
      GAR_MNT_DER_EVAL_EUR            NUMBER,
      GAR_PRC_POL_COUV                NUMBER,
      GAR_PRC_COM_COUV                NUMBER,
      GAR_DT_CONSTITUTION             DATE,
      GAR_DT_LIM_VALIDITE             DATE,
      GAR_DT_DER_EVAL                 DATE,
      TGR_CODE                        NUMBER,
      TGR_IND_TYPE                    CHAR(1 BYTE),
      GAR_IND_DEPENDANCE              CHAR(1 BYTE),
      GAR_FLAG_MONITORED              CHAR(1 BYTE),
      FLAG_RISK_PAYS                  CHAR(1 BYTE),
      GAR_HEDGING_RATE                NUMBER,
      GAR_MNT_PRIMANT_SG_EUR          NUMBER,
      GAR_PSR                         NUMBER,
      TGS_ID                          INTEGER,
      TGD_ID                          INTEGER,
      GAR_HOLDING_PERIOD              NUMBER,
      GAR_DT_MAT_ACTIF                DATE,
      GAR_PRICE_VOLATILITY            NUMBER,
      MU_COLLAT                       NUMBER,
      GAR_VAL_ACTIF_OCTROI_EUR        NUMBER,
      MDL_PRC_MISMATCH                NUMBER,
      GAR_FLAG_ASSET_DIVERSIFICATION  CHAR(1 BYTE),
      FLAG_MNT_PRIM_SG_NUL            CHAR(1 BYTE),
      GAR_PRC_COUVERT_ARROSAGE        NUMBER,
      GPC_ID                          CHAR(2 BYTE),
      GAR_LGD_RATING                  NUMBER(3,1),
      CRP_ID                          CHAR(2 BYTE),
      GPT_ID                          CHAR(2 BYTE)
    )
     
    CREATE INDEX IX_TCALC_GARANTIE_GAR_ID ON TCALC_GARANTIE
    (GAR_ID)

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    c'est à cout sûr un problème de HWM. Tu devrais essayer de copier les données dans une table temporaire, faire un TRUNCATE de ta table et réinjecter les données

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    j'ai droppé la table et je l'ai recrée.
    En fait le problème se pose quand je veux faire un select count(*) sur la table alors qu'il y'a un traitement batch qui tourne et qui fait des updates. d'ailleurs ce traitement mais un temps fou a se faire alors que d'habitude il met moins d'une heure. je n'arrive pas à comprendre.

    voici le traitement qui est effectué:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FOR vCollat IN (select gar.TGR_CODE, ent.CNC_OPTION_MODELE
            from TCALC_ENTITE ent, TCALC_GARANTIE gar
            where gar.ENT_ID = ent.ENT_ID)
    LOOP
     
        UPDATE TCALC_GARANTIE tcg
        SET tcg.TGS_ID = fGet_Typ_Collat(tcg.TGR_CODE, vCollat.CNC_OPTION_MODELE),
            tcg.TGD_ID = (SELECT tgsd.TGD_ID FROM TLIEN_GAR_SGCIB_DET tgsd
                                      WHERE tgsd.TGR_CODE = tcg.TGR_CODE)
        WHERE tcg.TGR_IND_TYPE = CST_GAR_TYPE_COLL and
    	tcg.TGR_CODE = vCollat.TGR_CODE;
    voici la fonction fGet_Typ_Collat:
    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
     
    CREATE OR REPLACE FUNCTION fGet_Typ_Collat(inTgr_Cod IN TTYP_GARANTIE.tgr_code%TYPE,
    		 				   					inTml_Id  IN TCONCOURS.tml_id%TYPE)
    RETURN TTYP_GARANTIE_SGCIB.tgs_id%TYPE
    IS
    	vTgs_Id TTYP_GARANTIE_SGCIB.tgs_id%TYPE;
    	cstModeleSGCIB	CONSTANT TTYP_MODELE_LGD.TML_ID%TYPE := '0';
        cstModeleKB		CONSTANT TTYP_MODELE_LGD.TML_ID%TYPE := '1';
    BEGIN
     
     -- Si le modèle est SGCIB
     IF inTml_Id = cstModeleSGCIB THEN
     	 BEGIN
    	     SELECT TGS_ID
    		 INTO   vTgs_Id
             FROM TLIEN_GAR_SGCIB
             WHERE TGR_CODE = inTgr_Cod;
     
    		 EXCEPTION
    		 	WHEN NO_DATA_FOUND THEN
    				 RETURN NULL;
    	 END;
    ELSIF inTml_Id = cstModeleKB THEN -- Si modèle KB
     
    	 BEGIN
    	     SELECT TGK_ID
    		 INTO   vTgs_Id
             FROM TLIEN_GAR_KB
             WHERE TGR_CODE = inTgr_Cod;
    	 EXCEPTION
    	 	WHEN NO_DATA_FOUND THEN
    			 RETURN NULL;
    	 END;
     
    ELSE -- Si autre : erreur
    	 RETURN NULL;
     
    END IF;
     
    RETURN vTgs_Id;
     
    END fGet_Typ_Collat;

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    un update par ligne du curseur + un SELECT/ligne updatée, tu m'étonnes que ça rame

    Faudrait faire un SELECT FOR UPDATE et intégrer les requêtes dans ton code PL/SQL.

    Pour la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT TGS_ID
             FROM TLIEN_GAR_SGCIB
             WHERE TGR_CODE = tcg.TGR_CODE
                 AND vCollat.CNC_OPTION_MODELE = '0'
    UNION ALL
    SELECT TGK_ID
             FROM TLIEN_GAR_KB
             WHERE TGR_CODE = tcg.TGR_CODE;
                 AND vCollat.CNC_OPTION_MODELE = '1'
    Et pour l'update :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        SELECT tcg.TGS_ID, tcg.TGD_ID, tcg.TGR_CODE, tgsd.TGD_ID,
          FROM TCALC_GARANTIE tcg, TLIEN_GAR_SGCIB_DET tgsd, 
                   (
                     SELECT gar.TGR_CODE, ent.CNC_OPTION_MODELE
                       FROM TCALC_ENTITE ent, TCALC_GARANTIE gar
                     WHERE gar.ENT_ID = ent.ENT_ID
                  ) vCollat
        WHERE tcg.TGR_IND_TYPE = CST_GAR_TYPE_COLL 
            AND tcg.TGR_CODE = vCollat.TGR_CODE
            AND tgsd.TGR_CODE = tcg.TGR_CODE
             FOR UPDATE;
    Et UPDATE... CURRENT OF.

    Evidemment, ce n'est qu'une ébauche, c'est pour te donner une idée d'optim à creuser.

Discussions similaires

  1. Programme VBA super lent !
    Par solal57 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 03/12/2007, 17h37
  2. picking super lent
    Par dmichel dans le forum OpenGL
    Réponses: 5
    Dernier message: 12/10/2007, 11h17
  3. [Oracle] ociplogon super lent
    Par Jedir dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 21/09/2007, 09h58
  4. socket : UDP a partir d'un autre ordi super lent
    Par RaphAstronome dans le forum Ruby
    Réponses: 3
    Dernier message: 21/05/2007, 22h15
  5. [JavaMail] Mail avec javamail super lent ?
    Par Baptiste Wicht dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 19/01/2006, 12h59

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