Requête sur la Vue est en cours d'exécution plus lente que la requête directe dans Oracle
J'ai essayé de créer de l'affichage avec les paramètres pour obtenir les données de façon dynamique.
(Je ne peux utiliser que si la condition que l'instruction select lui-même des modifications sur la base de paramètres)
Pour cela, j'ai écrit une procédure qui me renvoie les données nécessaires comme oracle type d'objet.
FUNCTION get_data(p_pk_id NUMBER, p_tab_type VARCHAR2)
RETURN M_TYPE_DATA_TAB
AS
v_table_collection M_TYPE_DATA_TAB;
BEGIN
-- my sql query which will change based on the params
RETURN v_table_collection;
END;
et j'ai exécuté la requête select comme suit.
SELECT * FROM TABLE(get_data(12345, 'MYTAB'));
qui me donne des données dans moins de 1 sec.
pour la même instruction select, j'ai créé une vue comme
CREATE OR REPLACE VIEW my_view
AS SELECT * FROM TABLE(get_data(12345, 'MYTAB'));
si j'ai une requête à la vue
SELECT * FROM my_view
il faut plus de 6 sec pour obtenir les mêmes données.
Aucune idée pourquoi il y a que beaucoup grande différence à la requête des mêmes données.
Sera la vue de prendre plus de temps que la normale requête?
select * from
sur le haut de quelque chose n'a pas d'importance. Nous avons besoin de savoir exactement ce que c'est qui rend votre cas particulier.comme Gontran Blohm dit, quand j'ai une requête à partir de la vue c'est l'exécution complète de la table d'analyse où la requête directe à l'aide de tous les index de la table de base pour obtenir les données plus rapidement.
C'est utile, mais nous n'avons toujours pas obtenu à la racine du problème. Je voudrais savoir pourquoi il utilise un FTS au lieu d'un index.
OriginalL'auteur Madhusudhan Dollu | 2013-12-12
Vous devez vous connecter pour publier un commentaire.
Le plan d'exécution de chaque instruction de vous donner plus de détails sur ce qui se passe. Essayez d'utiliser certains des outils oracle pour enquêter sur ce qui se passe exactement dans chaque cas.
Essayer de faire un:
puis faire un:
Ces va vous donner le plan d'exécution pour les instructions.
Par le chemin, vous aurez besoin de sélectionner à la V_$SQL_PLAN et V_$SQL vues pour utiliser le gather_plan_statistics comme ci-dessus.
OriginalL'auteur Tomás
Google pour "expliquer" plan de, et de vérifier le plan d'exécution pour les deux états. Sans la fonction complète, il est difficile de dire quoi que ce soit. Mais je suppose que l'optimiseur ne certains génériques "l'optimisation" sur la vue, et lorsque vous sélectionnez à partir de la vue, que le générique d'optimisation est utilisée. Lorsque vous sélectionnez directement, sans la vue, l'optimiseur considère le fonctionnement interne de votre fonction en tant que bien.
Essayer d'expliquer le plan sur les différents états de la sélection de la vue. Est la "partie interne", qui exécute la fonction, la même dans chaque cas?
en "Interne" de la fonction, où les conditions de travail diffèrent en fonction des paramètres. ils seront dynamiquement ajoutés et final de la requête sera exécutée pour récupérer le résultat
OriginalL'auteur Guntram Blohm