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 :
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
5 CREATE OR REPLACE FORCE VIEW v_category_1 (id_code, name) AS SELECT id_code, name FROM codes WHERE id_category = 'CAT1';
2ème méthode: Fonction
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
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 ).
Et dans ce cas, la requête d'insertion ressemble à :
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;
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.
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
D'avance, je vous remercie.
Partager