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 :

Equivalence avec la clause limit


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 20
    Points : 20
    Points
    20
    Par défaut Equivalence avec la clause limit
    bonjour tout le monde,
    j'ai besoin d'aide pour exécuter un équivalent de la clause limit de mysql sous oracle.
    j'ai bien trouver des codes qui sont FONCTIONNELLEMENT correct, mais question temps d’exécution, c'est la calamité.
    la requête suivante retourne bien le bon résultats, mais si on analyse bien, le requête interne génère un temps d’exécution énorme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * from 
    	(select req.*, rownum rnum from
    		(select distinct(ACCOUNT_NUM) from SCHEMA.TABLE where rownum < 5000 order by ACCOUNT_NUM asc) req where ROWNUM < 4000)
    	where rnum >= 2000
    j'aimerai savoir s'il est possible de récupérer les tuples entre 2000 et 4000 sans passer par les 5000 premiers, et encore la table contient pour le moment plus 1 000 000 de tuples DISTINCT.
    merci pour votre aide.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Essayez ainsi :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    with cte_dst as
    (
    select distinct ACCOUNT_NUM
      from SCHEMA.TABLE
    )
      ,  cte_rn as
    (
    select ACCOUNT_NUM
         , row_number() over(order by ACCOUNT_NUM asc) as rn
      from cte_dst
    )
    select ACCOUNT_NUM
      from cte_rn
     where rn >= 2000
       and rn <  40000;
    Montrez également les plans d'exécution des différentes requêtes.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    je te remercie Waldar,
    ta requête met 3 fois moins de temps à s’exécuter (6 secondes pour la tienne et 18 pour la mienne).

    mais à tout hasard, ça ne serai pas plus rapide si on crée une vue qui contiendrai seulement les distinct des account_num?

  4. #4
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par arezkikiki1 Voir le message
    ...
    mais à tout hasard, ça ne serai pas plus rapide si on crée une vue qui contiendrai seulement les distinct des account_num?
    Pour quoi pensez-vous que l'utilisation d'une vue pouvait accélérer l'exécution de la requête dans ce cas ?

  5. #5
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Si tu es en 12c, essaye la nouvelle fonctionnalité d'Oracle avec les mots clés OFFSET et FETCH.
    http://docs.oracle.com/javadb/10.5.3...fsetfetch.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    -- Sort T using column I, then fetch rows 11 through 20 of the sorted
    --   rows (inclusive)
    SELECT * FROM T ORDER BY I OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    Si tu es en 12c, essaye la nouvelle fonctionnalité d'Oracle avec les mots clés OFFSET et FETCH.
    non je suis en 11g, mais je vais me documenter .

    Pour quoi pensez-vous que l'utilisation d'une vue pouvait accélérer l'exécution de la requête dans ce cas ?
    ben, le distinct me retourne prés de 1 000 000 de tuples, alors que la table en contient plus de 27 000 000.

    la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select distinct ACCOUNT_NUM
      from SCHEMA.TABLE
    , devrait s'exécuter plus rapidement si on sélectionne depuis une vue non???

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Votre 1ere requête avec DISTINCT est fausse car il y a une restriction rownum < 5000 avant l'ORDER BY.
    Vous pouvez essayer comme ça également
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select * 
      from (select req.*, rownum rnum 
              from (select ACCOUNT_NUM 
                      from SCHEMA.TABLE 
                     group by ACCOUNT_NUM
                     order by ACCOUNT_NUM asc
                   ) req 
             where ROWNUM < 4000)
     where rnum >= 2000
    GROUP BY étant actuellement optimisé différemment que DISTINCT :
    Fast Query To Get TOP-N Distinct Rows From A Huge Data Table

    Cependant avec l'ORDER BY je ne suis pas sûr qu'il y ait une différence.

    Un vue stocke seulement le code, qui sera donc exécuté à chaque appel de la vue.
    Une vue matérialisée stocke le résultat de la requête (mais il faut la rafraichir).

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    salut skuatamad,
    en effet ta requête est encore plus rapide, elle met 2.5 secondes environ et ma première requête était effectivement fausse.
    y a pas à dire, optimiser les requêtes, c'est tout un art.
    merci pour l'info.

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

Discussions similaires

  1. Clause LIMIT avec une condition
    Par Fractaliste dans le forum Requêtes
    Réponses: 15
    Dernier message: 06/10/2012, 12h46
  2. [super requete] Dumper un model avec une clause where
    Par elievar dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2005, 17h05
  3. [VB.NET] Equivalence avec C#
    Par SoaB dans le forum Windows Forms
    Réponses: 7
    Dernier message: 19/01/2005, 13h57
  4. select avec un nombre limité de valeurs retournées
    Par felix79 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/12/2004, 15h16
  5. [JNDI] Equivalent avec Java Web Start ?
    Par cameleon2002 dans le forum Java EE
    Réponses: 8
    Dernier message: 18/09/2003, 18h55

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