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 :

Génération d'identifiant dans une vue


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Génération d'identifiant dans une vue
    Bonjour,
    je recupère des informations via une vue qui ne dispose pas de clé primaire.
    Il n'existe aucune données dans cette vue qui puisse etre pertinante pour composer un identifiant unique (potentiellement 2 lignes peuvent avoir les memes données).
    J'ai essayé de créer un identifiant en utilisant rownum, mais les perfs sont minable (on passe de 00.3s à 40 sec).
    Existe t'il un moyen de générer un identifiant unique en oracle (type uniqid php) ?
    Merci.

  2. #2
    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
    Par défaut
    oui, sys_guid(), mais rownum ne devrait pas dégrader -autant- la performance

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci, c'est nickel !
    pour le rownum, je ne sais pas pourquoi, ma vue est construite sur un UNION ALL avec des from dblink.
    C'est pas ma tasse de thé oracle en fait ;-)

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Quand tu dis que tu passes de 0,03 secondes à 40 secondes, est-ce que t'as essayé de fetcher l'ensemble des lignes dans le premier cas ?

    En effet, pour attribuer un rownum sur l'ensemble des lignes de la requête, Oracle doit fetcher l'intégralité des données, alors que s'il se contente d'exécuter une vue sans mettre de rownum, ton client ne fetch qu'un petit buffer (30 ou 40 lignes).

    Je pense que la différence de performances vient de là.

    Si tu fait ça, ça dure toujours 40 secondes ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select rownu, v.* from mavue v where <des critères qui filtrent 10 lignes>"

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut Lapin compris
    Citation Envoyé par StringBuilder Voir le message
    En effet, pour attribuer un rownum sur l'ensemble des lignes de la requête, Oracle doit fetcher l'intégralité des données, alors que s'il se contente d'exécuter une vue sans mettre de rownum, ton client ne fetch qu'un petit buffer (30 ou 40 lignes).
    Je suis pas certain de bien comprendre. Quand on utilise rownum, oracle recupere tout d'abord, histoire de pouvoir poser les rownums tranquillement?

    Parce que quand on ajoute WHERE rownum<10, au contraire ca va bien plus vite.

    Merci de m'eclairer!

  6. #6
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Rams7s Voir le message
    Je suis pas certain de bien comprendre. Quand on utilise rownum, oracle recupere tout d'abord, histoire de pouvoir poser les rownums tranquillement?

    Parce que quand on ajoute WHERE rownum<10, au contraire ca va bien plus vite.

    Merci de m'eclairer!
    Vu les résultats, c'est pourtant ce que j'ai l'impression qu'il fait.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Un simple explain plan répond pourtant à la question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    EXPLAIN PLAN FOR
    select *
      from sys.dba_tables
     where rownum <= 10;
     
    SELECT * FROM TABLE(dbms_xplan.display);
     
    -----------------------------------------------------------------------------------------------------                                                                                                                                                                                                        
    | Id  | Operation                          | Name           | Rows  | Bytes | Cost (%CPU)| Time     |                                                                                                                                                                                                        
    -----------------------------------------------------------------------------------------------------                                                                                                                                                                                                        
    |   0 | SELECT STATEMENT                   |                |    10 | 11120 |    40   (3)| 00:00:01 |                                                                                                                                                                                                        
    |*  1 |  COUNT STOPKEY                     |                |       |       |            |          |    
     
    ***

  8. #8
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    En effet, pour attribuer un rownum sur l'ensemble des lignes de la requête, Oracle doit fetcher l'intégralité des données, alors que s'il se contente d'exécuter une vue sans mettre de rownum, ton client ne fetch qu'un petit buffer (30 ou 40 lignes).
    lignes>"[/code]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    mhouri > select count(1) from emp;
     
      COUNT(1)                                                                      
    ----------                                                                      
            14
    Notez bien que la table emp contient 14 lignes

    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
     
    mhouri > set linesize 120
    mhouri > select /*+ gather_plan_statistics */
      2  * from emp
      3  where rownum <= 10;
     
         EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                   
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------                                   
          7369 allen      clerk           7902 30-MAR-10        815                    20                                   
          7499 allen      salesman        7698 20-FEB-81       1600        300         30                                   
          7521 ward       salesman        7698 22-FEB-81       1250        500         30                                   
          7566 jones      manager         7839 02-APR-81       2975                    20                                   
          7654 martin     salesman        7698 28-SEP-81       1250       1400         30                                   
          7698 blake      manager         7839 01-MAY-81       2850                    30                                   
          7782 clark      manager         7839 09-JUN-81       2450                    10                                   
          7788 scott      analyst         7566 09-DEC-82       3000                    20                                   
          7839 king       president            17-NOV-81       5000                    10                                   
          7844 turner     salesman        7698 08-SEP-81       1500          0         30                                   
     
    10 rows selected.
     
    mhouri > select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
     
    PLAN_TABLE_OUTPUT                                                                                                       
    --------------------------------------------------------------------------------------------
    SQL_ID  b6ccd7j9nqqcm, child number 0                                                                                   
    -------------------------------------                                                                                   
    select /*+ gather_plan_statistics */ * from emp where rownum <= 10                                                      
     
    Plan hash value: 4269703525                                                                                             
     
    -------------------------------------------------------------------------------------                                   
    | Id  | Operation          | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |                                   
    -------------------------------------------------------------------------------------                                   
    |*  1 |  COUNT STOPKEY     |      |      1 |        |     10 |00:00:00.01 |       4 |                                   
    |   2 |   TABLE ACCESS FULL| EMP  |      1 |     10 |     10 |00:00:00.01 |       4 |                                   
    -------------------------------------------------------------------------------------                                   
     
    Predicate Information (identified by operation id):                                                                     
    ---------------------------------------------------                                                                     
     
       1 - filter(ROWNUM<=10)
    Et notez bien maintenant dans la partie A-Rows de l'explain plan qu'Oracle n'a effectivement sélectionné que 10 lignes, malgré un FULL TABLE SCAN sur une table contenant 14 lignes. C'est l'opération 1 COUNT STOPKEY qui arrête oracle dans son opération FULL TABLE SCAN lorsque le "count" voulu est atteint

    Par contre, il faut faire attention avant de passer à la généralisation

    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
     
    mhouri > SELECT * FROM (SELECT /*+ gather_plan_statistics */ * FROM emp ORDER BY sal DESC) WHERE rownum <= 10;
     
         EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                   
    ---------- ---------- --------- ---------- --------- ---------- ---------- ----------                                   
          7839 king       president            17-NOV-81       5000                    10                                   
          7788 scott      analyst         7566 09-DEC-82       3000                    20                                   
          7902 ford       analyst         7566 03-DEC-81       3000                    20                                   
          7566 jones      manager         7839 02-APR-81       2975                    20                                   
          7698 blake      manager         7839 01-MAY-81       2850                    30                                   
          7782 clark      manager         7839 09-JUN-81       2450                    10                                   
          7499 allen      salesman        7698 20-FEB-81       1600        300         30                                   
          7844 turner     salesman        7698 08-SEP-81       1500          0         30                                   
          7934 miller     clerk           7782 23-JAN-82       1300                    10                                   
          7521 ward       salesman        7698 22-FEB-81       1250        500         30                                   
     
    10 rows selected.
     
    mhouri > select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
     
    PLAN_TABLE_OUTPUT                                                                                                       
    --------------------------------------------------------------------------------------------------------------------
    SQL_ID  cwxnmwrsvsaqb, child number 0                                                                                   
    -------------------------------------                                                                                   
    SELECT * FROM (SELECT /*+ gather_plan_statistics */ * FROM emp ORDER BY sal DESC) WHERE rownum <= 10                    
     
    Plan hash value: 2900113198                                                                                             
     
    ---------------------------------------------------------------------------------------------------------------------   
    | Id  | Operation               | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |   
    ---------------------------------------------------------------------------------------------------------------------   
    |*  1 |  COUNT STOPKEY          |      |      1 |        |     10 |00:00:00.01 |      15 |       |       |          |   
    |   2 |   VIEW                  |      |      1 |     14 |     10 |00:00:00.01 |      15 |       |       |          |   
    |*  3 |    SORT ORDER BY STOPKEY|      |      1 |     14 |     10 |00:00:00.01 |      15 |  2048 |  2048 | 2048  (0)|   
    |   4 |     TABLE ACCESS FULL   | EMP  |      1 |     14 |     14 |00:00:00.01 |      15 |       |       |          |   
    ---------------------------------------------------------------------------------------------------------------------   
     
    Predicate Information (identified by operation id):                                                                     
    ---------------------------------------------------                                                                     
     
       1 - filter(ROWNUM<=10)                                                                                               
       3 - filter(ROWNUM<=10)
    Ici, toutes les lignes ont été lues.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    Par contre, il faut faire attention avant de passer à la généralisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mhouri > SELECT * FROM (SELECT /*+ gather_plan_statistics */ * FROM emp ORDER BY sal DESC) WHERE rownum <= 10;
    [..]
    Ici, toutes les lignes ont été lues.
    Il y a un order by, ce serait quand même un gros paris que l'ensemble des lignes ne soient pas lues.
    Et je ne vois pas hyper-bien le rapport avec la phrase que vous citez.

    Par contre, on est d'accord. La phrase de stringbuilder est pour le moins etrange.

    Je suis desole, je reviens de week-end, pas facile de se remettre dans le bain.

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

Discussions similaires

  1. [SQL Server 2000] ajouter une colonne identité dans une vue?
    Par CetTer dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/08/2005, 13h43
  2. Count dans une vue
    Par gldfdp dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/07/2005, 05h55
  3. Réponses: 16
    Dernier message: 17/06/2005, 15h44
  4. Paramètres possibles dans une vue ms sql server
    Par lutin2003 dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 30/03/2005, 19h03
  5. Insérer dans une Vue ordonnée
    Par biroule dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 27/09/2004, 15h27

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