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 :

[10g via TOAD 9.5] Alter table, création d'une colonne calculée


Sujet :

Oracle

  1. #1
    CUCARACHA
    Invité(e)
    Par défaut [10g via TOAD 9.5] Alter table, création d'une colonne calculée
    Salut,

    Je dois ajouter deux colonnes à une table qui seront les membres d'une opération qui permettra de définir un pourcentage.

    J'ai ajouté les deux colonnes mais je n'ai pas trouvé, dans TOAD, à quel endroit on défini que la colonne résultat est calculée.

    J'ai trouvé un exemple sur le net qui semble suggérer de créer un index mais je n'ai pas bien compris.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE INDEX idx ON table_1 (a + b * (c - 1), a, b);
    Pourriez-vous m'aider ?

    D'avance merci

    Laurent

  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
    Les colonnes calculées (virtuelles chez Oracle) n'ont été introduites qu'à partir de la version 11g :
    http://download.oracle.com/docs/cd/E...htm#CNCPT44620 :
    Virtual column

    A column that is not stored on disk. The database derives the values in virtual columns on demand by computing a set of expressions or functions.
    http://download.oracle.com/docs/cd/E...htm#ADMIN12494 :
    Adding a Virtual Column

    If the new column is a virtual column, its value is determined by its column expression. (Note that a virtual column's value is calculated only when it is queried.)
    Vous pouvez néanmoins utiliser des index de fonction pour accélerer la requête :
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    create table t
    (
        a   number,
        b   number
    );
     
    insert into t (a, b) values (1, 2);
    insert into t (a, b) values (3, 1);
    insert into t (a, b) values (4, 2);
     
    commit;
     
    BEGIN
      DBMS_STATS.GATHER_TABLE_STATS
      (
        OWNNAME          => user,
        TABNAME          => 'T',
        ESTIMATE_PERCENT => 100,
        CASCADE          => TRUE
      );
    END;
    /
     
    select * from t
    where a + b - 1 = 5;
     
    /*
    Plan
    SELECT STATEMENT  ALL_ROWSCost: 4  Bytes: 6  Cardinality: 1  	
    	1 TABLE ACCESS FULL TABLE T Cost: 4  Bytes: 6  Cardinality: 1
    */
     
    create index i
    on t (a + b - 1);
     
    BEGIN
      DBMS_STATS.GATHER_TABLE_STATS
      (
        OWNNAME          => user,
        TABNAME          => 'T',
        ESTIMATE_PERCENT => 100,
        CASCADE          => TRUE
      );
    END;
    /
     
    select * from t
    where a + b - 1 = 5;
     
    /*
    Plan
    SELECT STATEMENT  ALL_ROWSCost: 2  Bytes: 9  Cardinality: 1  		
    	2 TABLE ACCESS BY INDEX ROWID TABLE T Cost: 2  Bytes: 9  Cardinality: 1  	
    		1 INDEX RANGE SCAN INDEX I Cost: 1  Cardinality: 1
    */
     
    drop index i;
     
    drop table t;

  3. #3
    CUCARACHA
    Invité(e)
    Par défaut
    Ok merci, je ferais le calcul à la volée, nous n'avons pas besoin de perfs il n'y a que quelques lignes...

    Bonne journée

    Laurent

  4. #4
    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
    J'ai oublié de préciser que vous pouvez également mettre ce calcul dans une vue.
    En reprenant la table t de l'exemple plus haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create view v as
    select a, b, a + b - 1 as c
      from t;
     
    select * from v
    where c = 5;
     
    Plan
    SELECT STATEMENT  ALL_ROWSCost: 2  Bytes: 9  Cardinality: 1  		
    	2 TABLE ACCESS BY INDEX ROWID TABLE T Cost: 2  Bytes: 9  Cardinality: 1  	
    		1 INDEX RANGE SCAN INDEX I Cost: 1  Cardinality: 1
    Ainsi c'est quasi transparent et les performances sont là.

  5. #5
    CUCARACHA
    Invité(e)
    Par défaut
    Merci, c'est exactement comme ça que je comptais faire...

    Bonne journée

    Laurent

Discussions similaires

  1. Création d'une colonne via une requête
    Par Helobio dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 16/12/2013, 15h26
  2. Création d'une colonne lien dans une table
    Par gabin11 dans le forum WebDev
    Réponses: 0
    Dernier message: 11/07/2011, 12h49
  3. Création d'une colonne dans table existante
    Par nawal59 dans le forum SQL
    Réponses: 2
    Dernier message: 26/01/2011, 10h09
  4. Alter Table pour définir une clé étrangère
    Par a-mix dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 18/10/2009, 19h18
  5. Réponses: 5
    Dernier message: 28/10/2008, 14h34

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