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

Oracle Discussion :

Problème de tri sur une PRIMARY KEY


Sujet :

Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Problème de tri sur une PRIMARY KEY
    Bonjour,

    J'ai un problème que je ne 'arrive pas à résoudre.
    Sur Oracle 9.2.0.1.0, j'ai une table comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       ID_DEFINITION_CARTE : NUMBER(10)
       ID_TYPE_CARTE : NUMBER(10)
       LIBELLE : VARCHAR2(35)
    Il existe une clef primaire sur la 1ère colonne, et un index non unique sur la 2ème colonne.

    Lorsque je passe la requete suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select id_definition_carte, id_type_carte, libelle from definition_carte where id_type_carte = 2;
    J'obtiens le résultat ci-dessous :

    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
    ID_DEFINITION_CARTE ID_TYPE_CARTE LIBELLE
    ------------------- ------------- -----------------------------------
                   2029             2 SENS
                  28045             2 PAYS
                     17             2 NUMERO RELEVE
                     18             2 NUMERO CARTE
                     19             2 NOM
                     20             2 PRENOM
                     21             2 DATE ACHAT
                     22             2 CODE OPERATION
                     23             2 MONTANT TTC
                     24             2 RAISON SOCIALE
                     25             2 NATURE VENTE
                     26             2 LOCALISATION
                     27             2 DEVISE
                     28             2 MONTANT DEVISE
     
    14 ligne(s) sÚlectionnÚe(s).
    Le résultat n'est pas trié selon la colonne ID_DEFINITION_CARTE, qui est pourtant la clef primaire.

    Je pensais que les clef primaire était triée automatiquement ?

    Voilà les paramètres du serveur :
    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
    SQL> SELECT * from NLS_DATABASE_PARAMETERS;
     
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_LANGUAGE                   AMERICAN
    NLS_TERRITORY                  AMERICA
    NLS_CURRENCY                   $
    NLS_ISO_CURRENCY               AMERICA
    NLS_NUMERIC_CHARACTERS         .,
    NLS_CHARACTERSET               WE8MSWIN1252
    NLS_CALENDAR                   GREGORIAN
    NLS_DATE_FORMAT                DD-MON-RR
    NLS_DATE_LANGUAGE              AMERICAN
    NLS_SORT                       BINARY
    NLS_TIME_FORMAT                HH.MI.SSXFF AM
    NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
    NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
    NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
    NLS_DUAL_CURRENCY              $
    NLS_COMP                       BINARY
    NLS_LENGTH_SEMANTICS           BYTE
    NLS_NCHAR_CONV_EXCP            FALSE
    NLS_NCHAR_CHARACTERSET         AL16UTF16
    NLS_RDBMS_VERSION              9.2.0.3.0
     
    20 ligne(s) sÚlectionnÚe(s).
    et les paramètres de la session :
    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
    SQL> SELECT * FROM NLS_SESSION_PARAMETERS;
     
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_LANGUAGE                   FRENCH
    NLS_TERRITORY                  FRANCE
    NLS_CURRENCY                   Ç
    NLS_ISO_CURRENCY               FRANCE
    NLS_NUMERIC_CHARACTERS         ,.
    NLS_CALENDAR                   GREGORIAN
    NLS_DATE_FORMAT                DD/MM/RR
    NLS_DATE_LANGUAGE              FRENCH
    NLS_SORT                       FRENCH
    NLS_TIME_FORMAT                HH24:MI:SSXFF
    NLS_TIMESTAMP_FORMAT           DD/MM/RR HH24:MI:SSXFF
    NLS_TIME_TZ_FORMAT             HH24:MI:SSXFF TZR
    NLS_TIMESTAMP_TZ_FORMAT        DD/MM/RR HH24:MI:SSXFF TZR
    NLS_DUAL_CURRENCY              Ç
    NLS_COMP                       BINARY
    NLS_LENGTH_SEMANTICS           BYTE
    NLS_NCHAR_CONV_EXCP            FALSE
     
    17 ligne(s) sÚlectionnÚe(s).
    Il se trouve que sur une copie de cet même schema, tout est OK.
    Il semble de plus que les nouveaux enregistrements soient ajoutés en haut et non en bas comme attendu.


    Merci de votre aide...

  2. #2
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    je n'ai jamais entendu dire que les enregistrements étaient triés sur la PK !
    Faire un order by dans la requête.
    Mais ou est le pb ??
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  3. #3
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Garuda
    je n'ai jamais entendu dire que les enregistrements étaient triés sur la PK !
    Faire un order by dans la requête.
    Mais ou est le pb ??
    Pourtant, cela semble être le cas dans MS SQL Serveur.
    Sous Oracle, j'ai toujours vu le dernier enregistrement se mettre à la fin dans mes SELECT.
    Avec une PK, il me semble qu'il y a un index qui se crée automatiquement, ce qui fait que c'était trié automatiquement aussi.

  4. #4
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Jamais entendu parler de ca.
    Quand bien même, je me repête, OU est le problème.
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  5. #5
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Garuda
    Jamais entendu parler de ca.
    Quand bien même, je me repête, OU est le problème.
    Le problème est que le programme ne fait pas d'order by sur les colonnes qui devrait être triées, car il y a une PK et un index.
    Je n'ai pas la main sur le programme pour forcer le tri.

    Du coup, ce programme fonctionne très bien sur plusieurs bases, mais pose problème sur de nouvelle base.

    J'ai l'impression qu'un paramètre a été modifiée dans la base depuis, mais je ne vois pas lequel (je ne suis pas DBA en plus).

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    L'ordre d'affichage sans ORDER BY n'a jamais été celui de la pk.
    C'est toujours dans l'ordre que l'Optimiseur choisit. (L'ordre dans lequel les lignes sont lues)
    Si la table n'est pas accédée par l'index de la PK, il n'y a aucune raison qu'il trie tout seul les données dans l'ordre de la PK (et heureusement, sinon ça boufferait de la mémoire et de l'IO pour du tri non voulu).

    Imagine : Tu fais un Table access Full sur une table
    Si tu devais trier les données dans l'ordre de la PK, il faudrait aller lire en plus l'index de la PK, puis les trier en mémoire

    Pour nous : Ce qui s'est passé lorsque ma boite a changé les bases en mode CHOOSE (ils étaient en Choose sans stat : Equivalent au mode RULE).
    Habitués à faire des SELECT sur des petites tables avec le début de la pk sans tri. ex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT pk1, pk2, col3 FROM MATABLE WHERE pk1 = 'SOCIETE1'
    Le mode rule prend l'index de la PK automatiquement => Tri implicite dans l'ordre de lecture de l'index de la PK
    Quand on est passé en CHOOSE : optimiseur : Pas besoin de lire l'index de la PK => Table access full => "Tri" dans l'ordre de lecture = Tri différent
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par McM
    Pour nous : Ce qui s'est passé lorsque ma boite a changé les bases en mode CHOOSE (ils étaient en Choose sans stat : Equivalent au mode RULE).
    Habitués à faire des SELECT sur des petites tables avec le début de la pk sans tri. ex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT pk1, pk2, col3 FROM MATABLE WHERE pk1 = 'SOCIETE1'
    Le mode rule prend l'index de la PK automatiquement => Tri implicite dans l'ordre de lecture de l'index de la PK
    Quand on est passé en CHOOSE : optimiseur : Pas besoin de lire l'index de la PK => Table access full => "Tri" dans l'ordre de lecture = Tri différent
    Pour ce qui est de l'optimisation, je suis tout à fait d'accord avec toi.
    Pour ce qui est du mode CHOOSE ou RULE, je vais regarder sur la base comment c'est mis.
    Je cherche comment on peut trouver ça, et je reviens

  8. #8
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Est ce que tu as changé de version (8.1=>9) ?
    Ne serais-ce pas du au fait qu'il n'ya plus d'optimisation 'RULES' en 9 ?
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  9. #9
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Mode de la base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT value
    FROM v$parameter
    WHERE name = 'optimizer_mode'
    Depuis la 9 en effet, il n'y a plus de mode RULE au niveau de la base.
    Mais s'il n'y a pas de stats pour les tables de la requete, Oracle utilise alors le mode RULE pour la requete.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  10. #10
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par McM
    Mode de la base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT value
    FROM v$parameter
    WHERE name = 'optimizer_mode'
    Depuis la 9 en effet, il n'y a plus de mode RULE au niveau de la base.
    Mais s'il n'y a pas de stats pour les tables de la requete, Oracle utilise alors le mode RULE pour la requete.
    Merci à tous les 2.
    Effectivement, le serveur est en mode CHOOSE.
    Je vais demandé à ce qu'on fasse un test en mode RULE.
    Et puis remonter l'info au développement pour faire des tri sur les PK.

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

Discussions similaires

  1. [2.x] Setter sur une primary key de type string
    Par snipemi dans le forum Symfony
    Réponses: 3
    Dernier message: 29/08/2011, 17h40
  2. Réponses: 1
    Dernier message: 16/10/2009, 11h02
  3. Problème de tri sur une table
    Par zzzantoine dans le forum VBA Access
    Réponses: 3
    Dernier message: 22/08/2008, 15h18
  4. [WD 12] Problème de tri sur une table
    Par L.Lemarchand dans le forum WinDev
    Réponses: 7
    Dernier message: 26/06/2008, 00h00
  5. auto-incrémentation sur une primary key avec sql server
    Par pops4 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/05/2007, 14h24

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