[optimisation] vue ou fonction ?
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:
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:
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:
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:
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.