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 :

l'ordre des lignes dans un Select


Sujet :

Oracle

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 92
    Points : 63
    Points
    63
    Par défaut l'ordre des lignes dans un Select
    Salut a tous.
    J'ai une question fondamentale dont je ne suis pas sur de la reponse :

    -quand j'execute un select qui fait un full scan d'une table (sans where ni order by) est ce que oracle est obligé de me donner les lignes dans l'ordre ou ils etaient saisies ?

  2. #2
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Points : 166
    Points
    166
    Par défaut
    je dirai plutôt tel qu'il exsiste dans la table

  3. #3
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Sans order by , ça veut dire que Oracle vous retourne les lignes comme ça lui chante, dans l'ordre qu'il veut lui ! (le RowId qui correspond assez souvent à l'ordre de saisie, sauf si il y a des moves, des redéfinitions online, ...)

    si ça ne vous convient pas, mettez un order by.

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 92
    Points : 63
    Points
    63
    Par défaut
    tu peux expliquer plus en detail ce veux dire tel qu'ils existent dans la table ?

  5. #5
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    j'aime bien cette citation
    Citation Envoyé par SQlPro
    Une table est un sac de bille
    cf 5. Le dernier...
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 92
    Points : 63
    Points
    63
    Par défaut
    SQlPro a écrit :
    Une table est un sac de bille

    Donc si je comprends bien Xo si j'ai une table , même sans faire de delete ou de move je peux avoir a chaque fois un ordre aléatoire

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Il faut bien que tu comprennes que l'ordre n'est pas une information stockée dans oracle. L'ordre n'est qu'une caractéristique de restitution.

  8. #8
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Citation Envoyé par comment_ca
    SQlPro a écrit :
    Une table est un sac de bille

    Donc si je comprends bien Xo si j'ai une table , même sans faire de delete ou de move je peux avoir a chaque fois un ordre aléatoire
    pas aléatoire, mais certaines opérations d'administration peuvent le modifier, c'est la raison pour laquelle ON NE PEUT PAS SE FIER A UN ORDRE SI ORDER BY N'EST PAS SPECIFIE

  9. #9
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    parfois aléatoire, par exemple lors d'un accès parallèle à la table, cela peut dépendre de la charge du serveur, des statistiques, du plan en shared pool et du pendule de ma grand-mère

  10. #10
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 92
    Points : 63
    Points
    63
    Par défaut
    C'est bien ce ke je pensais mais j'en etais pas si sur.Merci pour vos reponses

  11. #11
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Citation Envoyé par laurentschneider
    parfois aléatoire, par exemple lors d'un accès parallèle à la table, cela peut dépendre de la charge du serveur, des statistiques, du plan en shared pool et du pendule de ma grand-mère
    Peux-tu détailler, stp ? c'est super intérêssant !

    si tu fait un select sur ta table avec 2 threads parallel, l'ordre final sera une juxtaposition des 2 requêtes "filles" ?

  12. #12
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 92
    Points : 63
    Points
    63
    Par défaut
    Non je fais pas d'ordre select en parallèle c un select normal qui ne contient ni where ni order by.

    on va dire que j'ai une table t1(c1,c2,c3,c4,c5)
    j'ai une clé primaire composée de c1,c2,c3 dont forcèment un index sur ces 3 colonnes.Il y'a un contrôle au niveau de la saisie qui empèche par exemple l'element 2 d'être inséré après l'element 3 ce qui fais que mes enregistrements sont insérés dans l'ordre.

    Le paramètre optimizer_mode=choose.

    quand je fais un select * from t1; ça veux dire normalement qu'il va faire un full scan sans passer par l'index le truc est que les lignes sont parfois affichées dans l'ordre et parfois non.

  13. #13
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Citation Envoyé par comment_ca
    Non je fais pas d'ordre select en parallèle c un select normal qui ne contient ni where ni order by.
    ma question s'adressait à Laurent pour savoir comment exactement quand on est en exécution parallèle, l'aléatoire peut apparaitre ! ;-)

    pour votre problème, on a répondu : si vous voulez un ordre fiable, faites un order by !

  14. #14
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    De toutes façons, Oracle ne garanti rien, ne spécifie rien dans ce sens, on peut toujours essayer de constater le résultat mais ce ne sera qu'une "règle" empirique sans aucune garantie....

  15. #15
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    non, mais si l'exemple de Laurent permet de mieux comprendre comment marche le parallélisme, ce serait dommage de se priver de l'explication ! ;-)

    mais il est évident que si l'on souhaite un ordre, on utilise systématiquement ORDER BY !

  16. #16
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    en cas de parallelisme, rien ne permet de savoir quel thread aura fini en premier. Rien de tel qu'une petite démo

    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
     
    SQL> create table t05 (empno number, sal number)              
     partition by list (empno) 
     ( partition values (1) , partition values (2) , partition values (3), partition values (4) )
     parallel 4;
     
    Table created.
     
    SQL> insert into t05 values (1,1000);
     
    1 row created.
     
    SQL> insert into t05 values (2,1000);
     
    1 row created.
     
    SQL> insert into t05 values (3,1000);
     
    1 row created.
     
    SQL> insert into t05 values (4,1000);
     
    1 row created.
     
     
    SQL> select /*+ PARALLEL(4) */ empno from t05;
     
         EMPNO
    ----------
             3
             2
             1
             4
     
    SQL> select /*+ PARALLEL(4) */ empno from t05;
     
         EMPNO
    ----------
             4
             1
             3
             2
    mais ce n'est qu'un exemple. Il y a beaucoup d'autres conditions qui peuvent influencer sur l'ordre des lignes, entre autres le row chaining, les index, les index descendants, les tables IOT, les tables HASH CLUSTER, les tables SINGLE HASH CLUSTER SORTED, les LOBs, et bien d'autres encore que je ne mentionne pas. Même si on se limite au "TABLE ACCESS FULL", rien n'est encore joué...

Discussions similaires

  1. Ordre des lignes dans un tableau
    Par stomerfull dans le forum jQuery
    Réponses: 7
    Dernier message: 21/07/2011, 23h20
  2. Tester la selection des lignes dans un dataGrid
    Par dark_geek dans le forum Flex
    Réponses: 13
    Dernier message: 23/04/2010, 11h39
  3. ordre des lignes dans sql server
    Par bobby51 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/06/2008, 15h11
  4. Ordre des données dans un select
    Par Kiroukool dans le forum SQL
    Réponses: 1
    Dernier message: 03/07/2007, 08h48
  5. Garder l'ordre des Records dans une requete select distinct
    Par pobrouwers dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 21/02/2007, 22h06

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