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 :

Clé Primaire VARCHAR2(18) VS Integer?


Sujet :

SQL Oracle

  1. #21
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Citation Envoyé par w3blogfr Voir le message
    Que veut dire exactement TABLE ACCESS BY INDEX ROWID?
    Ça veut dire qu'on a lu le bloc qui contient la ligne après avoir trouvé son adresse dans l'index.

  2. #22
    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 w3blogfr Voir le message
    Que d'heure perdu pour des mauvaises statistiques
    Ca arrive souvent.

    Citation Envoyé par w3blogfr Voir le message
    ...
    Constatant dans tout les cas de meilleurs performances, j'ai préféré dé-normaliser un peu mes données pour éviter une jointure sur 2 tables importante.
    Vous renoncez un peu vite, non ?

    Citation Envoyé par w3blogfr Voir le message
    Contrairement a hier, Oracle disposant des bonnes statistiques, il préfère bien le full scan à l'utilisation de l'index qui est plus lent. Et les temps de réponse sont similaire entre LIKE '%BS%' et LIKE 'BS%'.
    Pour quoi voulez-vous qu'il y a une différence si l'index n'est pas utilisé ?

    Citation Envoyé par w3blogfr Voir le message
    ...
    En revanche, je re-testé l'ancienne requête en allant jusqu'à la table numSerie. Les temps de réponse sont toujours très lent
    Hier ça avait l'air d'être bien ou je me trompe ? Cf. "Deuxième Requête avec like '%BS%'. Environ 1 secondes"

    Citation Envoyé par w3blogfr Voir le message
    ...
    Que veut dire exactement TABLE ACCESS BY INDEX ROWID?
    Qu'un index a été utilisé pour localiser les enregistrements et qu'ensuite le Rowid récupéré de l'index est utilisé pour accèder à la table.

    Citation Envoyé par w3blogfr Voir le message
    ...
    Il existe un moyen de filtrer les distincts plus en amont dans ma requête?
    Essayez d'écrire votre requête de la façon suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT COUNT(produit.ProduitId)
    FROM Produit produit
    Where Exists (Select ...
                      )
    ...

  3. #23
    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,

    Juste un petit mot là dessus:
    Habitué à normaliser mes bases, j'utilise une clé primaire numérique.
    Au contraire: tu as une clé, il faut l'utiliser. Créer une clé supplémentaire, c'est le contraire de la normalisation: tu rajoute de la redondance.
    Et en plus, pour des raisons de performances, tu vas te retrouver à mettre cette redondance dans les autres tables pour éviter des jointures.

    Quel probléme y a-t-il à ce que la clé ne soit pas numérique ? au contraire tu peux alors:
    - avoir un histogramme pour gérer la distribution SN%
    - avoir envie de partitionner: les SN d'un côté par exemple.

    Si tu veux normaliser, alors peut-être avoir des colonnes pour spécifiques (type de produit, date,...) pour que l'utilisateur n'aille pas deviner une date ou un code dans le numéro de série.

    Ca me fait bizarre d'utiliser un varchar en clé primaire, mais c'est surement parce que je suis habitué à MySQL
    Pour quelle raison un number est mieux qu'un varchar sous MySQL ?

    Cordialement,
    Franck.

  4. #24
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Par défaut
    Très étrange, je n'ai pas reçu d'alerte mail pour les nouvelles réponses.

    Vous renoncez un peu vite, non ?
    Je pense pas avoir renoncer trop vite à la normalisation, j'ai déjà passer 2 semaines sur ce même problème .


    LIKE '%BS%' et LIKE 'BS%'.
    Pour quoi voulez-vous qu'il y a une différence si l'index n'est pas utilisé ?
    Non non, vu me qu’oracle fait un full scan, je comprend très bien pourquoi les temps sont similaire.


    Je vais adapter ma requête avec la méthode EXIST, je vous tiendrais au courant.

    Si j'utilise mon VARCHAR comme clé primaire de la table NUMSERIE, et donc comme clé étrangère également dans les autres tables. Je vais certainement ne pas faire les jointures jusqu'à NUMSERIE, et m'arrêter avant. Ne devrais-je pas alors partitionner le numéro de série dans les tables sous-jacente?


    Pour quelle raison un number est mieux qu'un varchar sous MySQL ?
    Non, je dis jusque qu'avec MySQL , on met un peu trop rapidement des clé primaire auto-incrémenté et que les varchar ne sont pas aussi bien géré que pour Oracle.

  5. #25
    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
    Voilà une requête équivalente.
    Pourriez-vous la tester et me dire quelle est le résultat ?
    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
     
    SELECT COUNT(produit.ProduitId)
      FROM Produit produit
     Where Exists (Select Null
                     From GROUPETEST groupeTest
                    Where produit.ProduitId = groupeTest.ProduitId
                      And Exists(Select Null
                                   From BANC banc
                                  Where banc.bancId = groupeTest.BancId 
                                    And (banc.bancReference || banc.bancNumSerie LIKE '%BANC%' OR
                                         banc.bancName || banc.bancNumSerie LIKE '%BANC%')
                                )                 
                      And Exists(Select Null
                                   From GROUPETESTNUMSERIE groupeTestNumSerie
                                  Where groupeTestNumSerie.groupeTestId = groupeTest.groupeTestId
                                    And groupeTestNumSerie.produitId =  groupeTest.produitId
                                    And groupeTestNumSerie.siteId = 1
                                    And Exists(Select Null
                                                 From NUMSERIE numSerie
                                                Where numSerie.numSerieId = groupeTestNumSerie.numSerieId
                                                  And numSerie.numSerie LIKE 'BS%'
                                               )
                                 )                  
                  )

  6. #26
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 123
    Par défaut
    Je passe d'environ 9 secondes (Requete avec JOIN) à 6 secondes (Requête avec EXISTS). Cela pour les requêtes utilisant LIKE 'BS%'.

    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
     
    --------------------------------------------------------------------------------------------------------------                                                                                                                                                                                               
    | Id  | Operation                         | Name                     | Rows  | Bytes | Cost (%CPU)| Time     |                                                                                                                                                                                               
    --------------------------------------------------------------------------------------------------------------                                                                                                                                                                                               
    |   0 | SELECT STATEMENT                  |                          |     1 |    18 |   583   (3)| 00:00:07 |                                                                                                                                                                                               
    |   1 |  SORT AGGREGATE                   |                          |     1 |    18 |            |          |                                                                                                                                                                                               
    |   2 |   NESTED LOOPS                    |                          |     1 |    18 |   583   (3)| 00:00:07 |                                                                                                                                                                                               
    |   3 |    VIEW                           | VW_SQ_1                  |     1 |    13 |   581   (3)| 00:00:07 |                                                                                                                                                                                               
    |   4 |     HASH UNIQUE                   |                          |     1 |    81 |            |          |                                                                                                                                                                                               
    |   5 |      NESTED LOOPS SEMI            |                          |     1 |    81 |   581   (3)| 00:00:07 |                                                                                                                                                                                               
    |*  6 |       HASH JOIN                   |                          |     1 |    46 |   580   (3)| 00:00:07 |                                                                                                                                                                                               
    |   7 |        TABLE ACCESS BY INDEX ROWID| GROUPETESTNUMSERIE    |     1 |    19 |     2   (0)| 00:00:01 |                                                                                                                                                                                               
    |   8 |         NESTED LOOPS              |                          |    17 |   595 |   573   (3)| 00:00:07 |                                                                                                                                                                                               
    |   9 |          SORT UNIQUE              |                          |    12 |   192 |   560   (3)| 00:00:07 |                                                                                                                                                                                               
    |* 10 |           TABLE ACCESS FULL       | NUMSERIE              |    12 |   192 |   560   (3)| 00:00:07 |                                                                                                                                                                                               
    |* 11 |          INDEX RANGE SCAN         | GROUPETESTNUMSERIE_PK |     1 |       |     1   (0)| 00:00:01 |                                                                                                                                                                                               
    |  12 |        TABLE ACCESS FULL          | GROUPETEST            |  6611 | 72721 |     7   (0)| 00:00:01 |                                                                                                                                                                                               
    |* 13 |       TABLE ACCESS BY INDEX ROWID | BANC                  |     2 |    70 |     1   (0)| 00:00:01 |                                                                                                                                                                                               
    |* 14 |        INDEX UNIQUE SCAN          | PK_BANC               |     1 |       |     1   (0)| 00:00:01 |                                                                                                                                                                                               
    |* 15 |    INDEX UNIQUE SCAN              | PRODUIT_PK            |     1 |     5 |     1   (0)| 00:00:01 |                                                                                                                                                                                               
    --------------------------------------------------------------------------------------------------------------                                                                                                                                                                                               
     
    Predicate Information (identified by operation id):                                                                                                                                                                                                                                                          
    ---------------------------------------------------                                                                                                                                                                                                                                                          
     
       6 - access("GROUPETESTNUMSERIE"."GROUPETESTID"="GROUPETEST"."GROUPETESTID" AND                                                                                                                                                                                                                            
                  "GROUPETESTNUMSERIE"."PRODUITID"="GROUPETEST"."PRODUITID")                                                                                                                                                                                                                                     
      10 - filter("NUMSERIE"."NUMSERIE" LIKE 'BS%' AND UPPER("NUMSERIE") LIKE 'BS%')                                                                                                                                                                                                                             
      11 - access("NUMSERIE"."NUMSERIEID"="GROUPETESTNUMSERIE"."NUMSERIEID" AND                                                                                                                                                                                                                                  
                  "GROUPETESTNUMSERIE"."SITEID"=1)                                                                                                                                                                                                                                                               
           filter("GROUPETESTNUMSERIE"."SITEID"=1)                                                                                                                                                                                                                                                               
      13 - filter("BANC"."BANCREFERENCE"||"BANC"."BANCNUMSERIE" LIKE '%BANC%' OR                                                                                                                                                                                                                                   
                  "BANC"."BANCNAME"||"BANC"."BANCNUMSERIE" LIKE '%BANC%')                                                                                                                                                                                                                                          
      14 - access("BANC"."BANCID"="GROUPETEST"."BANCID")                                                                                                                                                                                                                                                         
      15 - access("PRODUIT"."PRODUITID"="PRODUITID")
    j'ai essayé avec les requêtes LIKE '%BS%' où il fait un full scan de la table du coup. La requête avec les JOIN met environ 0,5 seconde contre tps>1 seconde avec les EXISTS.

Discussions similaires

  1. Clé primaire en Char[6] ou Integer ?
    Par ilellouc dans le forum Optimisations
    Réponses: 12
    Dernier message: 01/03/2010, 01h13
  2. Concaténation de deux integer pour former une clé primaire
    Par stoukou dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 08/09/2005, 11h34
  3. Passage du type integer vers varchar sur clé primaire
    Par GMI dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/01/2005, 10h09
  4. Concaténation de String et Integer
    Par Ingham dans le forum Langage
    Réponses: 5
    Dernier message: 21/01/2003, 18h26
  5. comment integer une animation swf dans une page
    Par naili dans le forum Intégration
    Réponses: 7
    Dernier message: 18/09/2002, 19h54

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