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 :

Pourquoi Oracle fait un tri sur un champ indexé ?


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Par défaut Pourquoi Oracle fait un tri sur un champ indexé ?
    Exemple:

    create table beu (s varchar2(100), t number )
    create index beux on beu(s)
    create index beut on beu(t)

    select t from beu where t > 10 order by t
    Le plan d'exécution est:
    INDEX(RANGE SCAN) beut

    select s from beu where s > '10' order by s
    Le plan d'exécution est:
    SORT (ORDER BY)
    INDEX(RANGE SCAN) beux

    Pourquoi Oracle fait encore un tri sur le champ s qui est indexé ?

  2. #2
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Je pense que dans la 1ere requête il ne trie pas sur la colonne t car c'est un numérique.
    Par contre, dans la 2e requête, s est un VARCHAR, et il est obligé de trier le résultat pour tenir compte des paramètres de session concernant les options de tri (NLS_SORT).

    Exemple :
    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
    insert into beu values ('1', 1);
    insert into beu values ('a', 1);
    insert into beu values ('A', 1);
    insert into beu values (null, 1);
     
    SQL> alter session set nls_sort='FRENCH';
     
    Session modifiée.
     
    SQL> select s from beu order by s;
     
    S
    -----------------------------------------------
    A
    a
    1
     
     
    SQL> alter session set nls_sort='BINARY';
     
    Session modifiée.
     
    SQL> select s from beu order by s;
     
    S
    -----------------------------------------------
    1
    A
    a

  3. #3
    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
    Oui, c'est ça
    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
     
    mni@XXX>alter session set nls_sort = binary
      2  ;
     
    Session modifiée.
     
    mni@XXX>set autotrace traceonly explain
    mni@XXX>select t from beu where s > '10' order by s;
     
    Plan d'exécution
    ----------------------------------------------------------
              0                    SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=2 Card=4 Bytes=260)
     
     
              1                  0   TABLE ACCESS (BY INDEX ROWID) OF 'BEU' (Cost=2 Card=4 Bytes=260)
     
     
              2                  1     INDEX (RANGE SCAN) OF 'BEUX' (NON-UNIQUE) (Cost=2 Card=1)
     
     
     
     
     
    mni@XXX>alter session set nls_sort = 'FRENCH';
     
    Session modifiée.
     
    mni@XXX>select t from beu where s > '10' order by s;
     
    Plan d'exécution
    ----------------------------------------------------------
              0                    SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=4 Card=4 Bytes=260)
     
     
              1                  0   SORT (ORDER BY) (Cost=4 Card=4 Bytes=260)
     
     
              2                  1     TABLE ACCESS (BY INDEX ROWID) OF 'BEU' (Cost=2 Card=4 Bytes=260)
     
     
              3                  2       INDEX (RANGE SCAN) OF 'BEUX' (NON-UNIQUE) (Cost=2 Card=1)

Discussions similaires

  1. Tri sur les champs
    Par Pias dans le forum Requêtes
    Réponses: 2
    Dernier message: 13/04/2006, 17h14
  2. Tri sur un champ VARCHAR
    Par hisy dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 15/02/2006, 17h02
  3. Tri sur deux champs en même temps
    Par Azharis dans le forum Access
    Réponses: 8
    Dernier message: 11/01/2006, 13h10
  4. tri sur des champs calculés
    Par Thib dans le forum Bases de données
    Réponses: 10
    Dernier message: 18/10/2005, 17h24
  5. [Collection] Tris sur plusieurs champs
    Par partyboy dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 12/07/2005, 16h56

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