Bonjour,

je suis en train de parcourir un projet. Et j'ai vu qu'une même opération était réalisée de deux façons différentes. Par soucis de clarté, j'aimerais n'utiliser qu'une seule méthode. Afin d'opter pour la bonne méthode, j'aimerais savoir si une de ces deux méthodes est meilleure que l'autre, et si oui pourquoi.

Voici la situation.

Une table 'codes' contient trois colonnes : id_category, id_code, name.

Une catégorie contient plusieurs codes. Au sein d'une catégorie, à chaque id_code correspond un name.

Le name correspondant à une paire <id_category ; id_code> doit être inséré dans d'autres tables. Actuellement deux méthodes sont utilisées.

1ère méthode: Vue

Une vue (non matérialisée) est crée pour chaque catégorie :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
CREATE OR REPLACE FORCE VIEW v_category_1 (id_code, name)
AS
    SELECT id_code, name
    FROM codes
    WHERE id_category = 'CAT1';
Ensuite lors de l'insertion dans la table finale, on réalise une jointure (selon cette méthode : http://blog.developpez.com/sqlpro?ti..._dans_le_from_) entre la vue et une table d'input contenant également un id_code. A noter qu'on insère tout le contenu de la table d'input en une seule opération.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
INSERT INTO final_table
SELECT name from v_category_1 
   JOIN input_table 
   ON v_category_1.id_code = input_table.id_code
2ème méthode: Fonction

Une fonction valide pour toutes les catégories de code a été créée (-> avantage pour la maintenance mais ce n'est pas le sujet de ma 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
15
16
17
18
CREATE OR REPLACE FUNCTION FUNC_CODES (InFielD VARCHAR2,InValue VARCHAR2)
RETURN VARCHAR2
IS
 
    OutValue codes.name%type;
 
BEGIN
 
    OutValue := null;
 
    select  name
            into    OutValue
            from    codes
            where   upper(rtrim(id_category)) = upper(rtrim(InField)) and
                    upper(trim(id_code)) = upper(rtrim(InValue));
 
    RETURN OutValue;
END FUNC_CODES;
Et dans ce cas, la requête d'insertion ressemble à :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
INSERT INTO final_table
SELECT func_codes('CAT1', id_code)
FROM input_table
Ma question est donc, quelle est la méthode offrant le meilleur niveau de performance, sachant que les input_table peuvent contenir jusqu'à quelques millions de records ? Bien sûr, quelques explications justificatives sont les bienvenues.

D'avance, je vous remercie.