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

Administration Oracle Discussion :

Index sur une colonne VARCHAR2


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 224
    Par défaut Index sur une colonne VARCHAR2
    Bonjour,


    Je rencontre une difficulté avec un index. Je possède une table avec 11 millions d'environnement. Dans cette table, il y a une colonne de type VARCHAR2 NOT NULL qui possède seulement 1 million d'enregistrement les autres étant null.

    Le problème est le suivant :

    Lorsque des utilsiatuer font une recherche sur ce fameux champ, oracle réalise un full scan sur cette table et mets 10 minutes à retourner le résultat.

    J'ai essayé de créer un index sur la colonne mais cela ne change absolument rien... comment puis-je faire pour que mes utilisateurs puissent faire une recherche sur ce champ en quelques secondes ?

    Merci.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 270
    Par défaut
    Citation Envoyé par Milo59000 Voir le message
    Bonjour,


    Je rencontre une difficulté avec un index. Je possède une table avec 11 millions d'environnement. Dans cette table, il y a une colonne de type VARCHAR2 NOT NULL qui possède seulement 1 million d'enregistrement les autres étant null.

    Le problème est le suivant :

    Lorsque des utilsiatuer font une recherche sur ce fameux champ, oracle réalise un full scan sur cette table et mets 10 minutes à retourner le résultat.

    J'ai essayé de créer un index sur la colonne mais cela ne change absolument rien... comment puis-je faire pour que mes utilisateurs puissent faire une recherche sur ce champ en quelques secondes ?

    Merci.
    Si je comprend bien :
    Il y a une table avec 11 millions de lignes.
    Cette table a une colonne not null.
    Il y a une valeur dans 1 million de lignes dans cette colone.
    Donc, il y a 10 millions de ligne dans les quelles une colonne not null est null.

    >> soit la colonne n'est pas si not null que ça, soit la table ne contient pas 11 millions de lignes.

    A par ça, je pense que tu n'as pas lancé les statistiques.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 224
    Par défaut
    Arf... Petite correction, la colonne VARCHAR2 n'est pas de type NOT NULL ^^ cette colonne, contient très peu de valeurs et les utilisateurs réalisent des requêtes avec ce champ en clause WHERE.

    Pour info, cela se réalise via IHM (CRM siebel), les statistiques sont normalement à jour.

    Je vais relancer les statistiques sur la table et sur l'index créé et je vous tiens au courant.

  4. #4
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Il faudrait voir la clause where de la requête pour voir si un index peut être utilisé, ansi que son plan d'exécution, et le nombre d'enregistrements retournés. S'il s'agit de récupérer 9% des enregistrements (1/11) il n'est pas impossible que le full scan soit plus rapide que l'index.
    Cordialement,
    Franck.

  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
    sous sqlplus tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    set timing on
    set autotrace traceonly
    ensuite t'exécute ta requête.
    t'auras le temps d'exécution, le plan d'exécution et quelques stats d'exécution.
    Et tu nous envoi tout ça

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 224
    Par défaut
    Alors, voilà le retour sans index :

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=94695 Card=1 Bytes=2179)
     
       1    0   FILTER
       2    1     NESTED LOOPS (OUTER) (Cost=94695 Card=1 Bytes=2179)
       3    2       NESTED LOOPS (OUTER) (Cost=94694 Card=1 Bytes=2168)
       4    3         NESTED LOOPS (OUTER) (Cost=94693 Card=1 Bytes=2146)
       5    4           NESTED LOOPS (OUTER) (Cost=94692 Card=1 Bytes=2119)
       6    5             NESTED LOOPS (OUTER) (Cost=94691 Card=1 Bytes=2089)
       7    6               NESTED LOOPS (OUTER) (Cost=94690 Card=1 Bytes=2071)
       8    7                 NESTED LOOPS (OUTER) (Cost=94689 Card=1 Bytes=2060)
       9    8                   NESTED LOOPS (OUTER) (Cost=94688 Card=1 Bytes=2047)
      10    9                     NESTED LOOPS (OUTER) (Cost=94687 Card=1Bytes=2034)
      11   10                       NESTED LOOPS (OUTER) (Cost=94686 Card=1 Bytes=2003)
      12   11                         NESTED LOOPS (OUTER) (Cost=94685 Card=1 Bytes=1971)
      13   12                           NESTED LOOPS (OUTER) (Cost=94684 Card=1 Bytes=1951)
      14   13                             NESTED LOOPS (OUTER) (Cost=94683 Card=1 Bytes=1920)
      15   14                               NESTED LOOPS (OUTER) (Cost=94682 Card=1 Bytes=1826)
      16   15                                 NESTED LOOPS (OUTER) (Cost=94681 Card=1 Bytes=1805)
      17   16                                   NESTED LOOPS (OUTER) (Cost=94680 Card=1 Bytes=1748)
      18   17                                     NESTED LOOPS (OUTER) (Cost=94679 Card=1 Bytes=1651)
      19   18                                       NESTED LOOPS (OUTER) (Cost=94678 Card=1 Bytes=1604)
      20   19                                         NESTED LOOPS (OUTER) (Cost=94677 Card=1 Bytes=1501)
      21   20                                           NESTED LOOPS (OUTER) (Cost=94676 Card=1 Bytes=1416)
      22   21                                             NESTED LOOPS (OUTER) (Cost=94675 Card=1 Bytes=1319)
      23   22                                               NESTED LOOPS (OUTER) (Cost=94674 Card=1 Bytes=1243)
      24   23                                                 NESTED LOOPS (OUTER) (Cost=94673 Card=1 Bytes=1229)
      25   24                                                   NESTED LOOPS (OUTER) (Cost=94672 Card=1 Bytes=1190)
      26   25                                                     NESTED LOOPS (OUTER) (Cost=94671 Card=1 Bytes=1119)
      27   26                                                       NESTED LOOPS (OUTER) (Cost=94670 Card=1 Bytes=1101)
      28   27                                                         NESTED LOOPS (OUTER) (Cost=94669 Card=1 Bytes=1043)
      29   28                                                           NESTED LOOPS (OUTER) (Cost=94668 Card=1 Bytes=940)
      30   29NESTED LOOPS (OUTER) (Cost=94667 Card=1 Bytes=803)
      31   30  NESTED LOOPS (OUTER) (Cost=94666 Card=1 Bytes=758)
      32   31    TABLE ACCESS (FULL) OF 'S_EVT_ACT' (Cost=94665 Card=1 Bytes=651)
      33   31    TABLE ACCESS (BY INDEX ROWID) OF 'S_PROJ' (Cost=1 Card=1 Bytes=107)
      34   33      INDEX (UNIQUE SCAN) OF 'S_PROJ_P1' (UNIQUE)
      35   30  TABLE ACCESS (BY INDEX ROWID) OF 'S_PROJITEM' (Cost=1 Card=1 Bytes=45)
      36   35    INDEX (UNIQUE SCAN) OF 'S_PROJITEM_P1' (UNIQUE)
      37   29TABLE ACCESS (BY INDEX ROWID) OF 'S_EVT_ACT_SS' (Cost=1 Card=1 Bytes=137)
      38   37  INDEX (RANGE SCAN) OF 'S_EVT_ACT_SS_U1' (UNIQUE) (Cost=1 Card=1)
      39   28                                                           TABLE ACCESS (BY INDEX ROWID) OF 'S_SUSP_ACT' (Cost=1 Card=1 Bytes=103)
      40   39INDEX (RANGE SCAN) OF 'S_SUSP_ACT_U1' (UNIQUE) (Cost=1 Card=1)
      41   27                                                         TABLE ACCESS (BY INDEX ROWID) OF 'S_SRC' (Cost=1 Card=1 Bytes=58)
      42   41                                                           INDEX (UNIQUE SCAN) OF 'S_SRC_P1' (UNIQUE)
      43   26                                                       TABLEACCESS (BY INDEX ROWID) OF 'S_ORDER' (Cost=1 Card=1 Bytes=18)
      44   43                                                         INDEX (UNIQUE SCAN) OF 'S_ORDER_P1' (UNIQUE)
      45   25                                                     TABLE ACCESS (BY INDEX ROWID) OF 'S_EVT_MAIL' (Cost=1 Card=1 Bytes=71)
      46   45                                                       INDEX(RANGE SCAN) OF 'S_EVT_MAIL_U1' (UNIQUE) (Cost=2 Card=1)
      47   24                                                   TABLE ACCESS (BY INDEX ROWID) OF 'S_OPTY' (Cost=1 Card=1 Bytes=39)
      48   47                                                     INDEX (UNIQUE SCAN) OF 'S_OPTY_P1' (UNIQUE) (Cost=1 Card=1)
      49   23                                                 TABLE ACCESS (BY INDEX ROWID) OF 'S_CONTACT_FNX' (Cost=1 Card=1 Bytes=14)
      50   49                                                   INDEX (RANGE SCAN) OF 'S_CONTACT_FNX_U1' (UNIQUE) (Cost=2 Card=1)
      51   22                                               TABLE ACCESS (BY INDEX ROWID) OF 'S_CONTACT' (Cost=1 Card=1 Bytes=76)
      52   51                                                 INDEX (UNIQUE SCAN) OF 'S_CONTACT_U2' (UNIQUE) (Cost=1 Card=1)
      53   21                                             TABLE ACCESS (BY INDEX ROWID) OF 'S_EVT_MKTG' (Cost=1 Card=1 Bytes=97)
      54   53                                               INDEX (RANGE SCAN) OF 'S_EVT_MKTG_U1' (UNIQUE) (Cost=1 Card=1)
      55   20                                           TABLE ACCESS (BY INDEX ROWID) OF 'S_EVT_CAL' (Cost=1 Card=1 Bytes=85)
      56   55                                             INDEX (RANGE SCAN) OF 'S_EVT_CAL_U1' (UNIQUE) (Cost=1 Card=1)
      57   19                                         TABLE ACCESS (BY INDEX ROWID) OF 'S_SRV_ACT' (Cost=1 Card=1 Bytes=103)
      58   57                                           INDEX (RANGE SCAN) OF 'S_SRV_ACT_U1' (UNIQUE) (Cost=1 Card=1)
      59   18                                       TABLE ACCESS (BY INDEX ROWID) OF 'S_SRV_REQ' (Cost=1 Card=1 Bytes=47)
      60   59                                         INDEX (UNIQUE SCAN)OF 'S_SRV_REQ_P1' (UNIQUE) (Cost=1 Card=1)
      61   17                                     TABLE ACCESS (BY INDEX ROWID) OF 'S_EVT_ACT_FNX' (Cost=1 Card=1 Bytes=97)
      62   61                                       INDEX (RANGE SCAN) OF'S_EVT_ACT_FNX_U1' (UNIQUE) (Cost=2 Card=1)
      63   16                                   TABLE ACCESS (BY INDEX ROWID) OF 'S_FN_APPR' (Cost=1 Card=1 Bytes=57)
      64   63                                     INDEX (UNIQUE SCAN) OF 'S_FN_APPR_P1' (UNIQUE)
      65   15                                 TABLE ACCESS (BY INDEX ROWID) OF 'S_ASSET' (Cost=1 Card=1 Bytes=21)
      66   65                                   INDEX (UNIQUE SCAN) OF 'S_ASSET_P1' (UNIQUE) (Cost=1 Card=1)
      67   14                               TABLE ACCESS (BY INDEX ROWID)OF 'S_ORG_EXT' (Cost=1 Card=1 Bytes=94)
      68   67                                 INDEX (UNIQUE SCAN) OF 'S_ORG_EXT_U3' (UNIQUE) (Cost=1 Card=1)
      69   13                             TABLE ACCESS (BY INDEX ROWID) OF 'S_ORG_EXT' (Cost=1 Card=1 Bytes=31)
      70   69                               INDEX (UNIQUE SCAN) OF 'S_ORG_EXT_U3' (UNIQUE) (Cost=1 Card=1)
      71   12                           TABLE ACCESS (BY INDEX ROWID) OF 'S_ORG_EXT_FNX' (Cost=1 Card=1 Bytes=20)
      72   71                             INDEX (UNIQUE SCAN) OF 'S_ORG_EXT_FNX_P1' (UNIQUE) (Cost=1 Card=1)
      73   11                         TABLE ACCESS (BY INDEX ROWID) OF 'S_ORG_EXT_X' (Cost=1 Card=1 Bytes=32)
      74   73                           INDEX (RANGE SCAN) OF 'S_ORG_EXT_X_U1' (UNIQUE) (Cost=2 Card=1)
      75   10                       TABLE ACCESS (BY INDEX ROWID) OF 'S_ORG_EXT' (Cost=1 Card=1 Bytes=31)
      76   75                         INDEX (UNIQUE SCAN) OF 'S_ORG_EXT_U3' (UNIQUE) (Cost=1 Card=1)
      77    9                     TABLE ACCESS (BY INDEX ROWID) OF 'S_ORG_EXT_X' (Cost=1 Card=1 Bytes=13)
      78   77                       INDEX (RANGE SCAN) OF 'S_ORG_EXT_X_U1' (UNIQUE) (Cost=2 Card=1)
      79    8                   TABLE ACCESS (BY INDEX ROWID) OF 'S_ORG_EXT_X' (Cost=1 Card=1 Bytes=13)
      80   79                     INDEX (RANGE SCAN) OF 'S_ORG_EXT_X_U1' (UNIQUE) (Cost=2 Card=1)
      81    7                 INDEX (UNIQUE SCAN) OF 'S_PARTY_P1' (UNIQUE) (Cost=1 Card=1 Bytes=11)
      82    6               TABLE ACCESS (BY INDEX ROWID) OF 'S_ACT_EMP' (Cost=1 Card=1 Bytes=18)
      83   82                 INDEX (RANGE SCAN) OF 'S_ACT_EMP_F1' (NON-UNIQUE) (Cost=2 Card=1)
      84    5             TABLE ACCESS (BY INDEX ROWID) OF 'S_ACT_EMP' (Cost=1 Card=1 Bytes=30)
      85   84               INDEX (RANGE SCAN) OF 'S_ACT_EMP_U1' (UNIQUE)(Cost=2 Card=1)
      86    4           TABLE ACCESS (BY INDEX ROWID) OF 'S_USER' (Cost=1Card=1 Bytes=27)
      87   86             INDEX (UNIQUE SCAN) OF 'S_USER_U2' (UNIQUE)
      88    3         TABLE ACCESS (BY INDEX ROWID) OF 'S_CONTACT_FNX' (Cost=1 Card=1 Bytes=22)
      89   88           INDEX (RANGE SCAN) OF 'S_CONTACT_FNX_U1' (UNIQUE)(Cost=2 Card=1)
      90    2       INDEX (UNIQUE SCAN) OF 'S_PARTY_P1' (UNIQUE) (Cost=1 Card=1 Bytes=11)
      91    1     NESTED LOOPS (Cost=4 Card=1 Bytes=67)
      92   91       NESTED LOOPS (Cost=3 Card=2 Bytes=112)
      93   92         NESTED LOOPS (Cost=2 Card=2 Bytes=76)
      94   93           TABLE ACCESS (BY INDEX ROWID) OF 'S_CONTACT' (Cost=1 Card=1 Bytes=20)
      95   94             INDEX (UNIQUE SCAN) OF 'S_CONTACT_P1' (UNIQUE) (Cost=2 Card=1)
      96   93           INDEX (RANGE SCAN) OF 'S_OPTY_POSTN_U1' (UNIQUE) (Cost=2 Card=2 Bytes=36)
      97   92         TABLE ACCESS (BY INDEX ROWID) OF 'S_POSTN' (Cost=1 Card=1 Bytes=18)
      98   97           INDEX (RANGE SCAN) OF 'S_POSTN_V1' (NON-UNIQUE) (Cost=1 Card=1)
      99   91       INDEX (UNIQUE SCAN) OF 'S_PARTY_P1' (UNIQUE) (Cost=1 Card=1 Bytes=11)
     
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
       12940714  consistent gets
        1566002  physical reads
             60  redo size
          14862  bytes sent via SQL*Net to client
           5662  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed
    Le temps d'exécution est de environ 10 minutes. Comme vous pouvez le voir, il y a un SCAN FULL sur la table S_EVT_ACT qui possède un gros coût (94665).

    Je fais avec l'index.

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

Discussions similaires

  1. Index sur une colonne
    Par logiciel_const dans le forum SQL
    Réponses: 4
    Dernier message: 22/06/2011, 14h09
  2. Création d'index sur une colonne TEXT
    Par AyManoVic dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/08/2010, 00h12
  3. Réponses: 1
    Dernier message: 27/07/2009, 16h11
  4. INDEX sur une colonne qui peut être NULL
    Par dorian53 dans le forum Requêtes
    Réponses: 15
    Dernier message: 29/11/2007, 17h13
  5. Index sur une colonne Date
    Par sjaeger dans le forum Oracle
    Réponses: 11
    Dernier message: 10/11/2005, 14h55

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