Abfrage auf Ansicht langsamer ausgeführt wird als die direkte Abfrage in Oracle
Ich habe versucht, erstellen, anzeigen mit Parametern, um die Daten dynamisch.
(Ich nicht verwenden, WO Zustand, wie die select-Anweisung selbst ändert sich basierend auf den Parametern)
Dazu schrieb ich ein Verfahren, das gibt mir die notwendigen Daten als oracle-Objekttyp.
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;
und ich führe die select-Abfrage wie folgt.
SELECT * FROM TABLE(get_data(12345, 'MYTAB'));
gibt mir die Daten in weniger als 1 sec.
für die gleiche select-Anweisung habe ich eine Ansicht als
CREATE OR REPLACE VIEW my_view
AS SELECT * FROM TABLE(get_data(12345, 'MYTAB'));
wenn ich die Abfrage der view
SELECT * FROM my_view
dauert es mehr als 6 sec auf die selben Daten bekommen.
Jede Idee, warum es ist, dass sehr großen Unterschied zum Abfragen der gleichen Daten.
Wird die veiw mehr Zeit in Anspruch als eine normale Abfrage?
- Einen vollständig reproduzierbaren Testfall würde enorm helfen hier. Im Allgemeinen nur das hinzufügen einer
select * from
auf top spielt sowas von keine Rolle. Wir müssen genau wissen, was es ist, macht Ihren Fall besonders. - als Guntram Blohm sagte, wenn ich die Abfrage aus der Ansicht, die er leistet full table scan, wo die direkte Abfrage über alle Indizes der Basis-Tabelle, um die Daten schneller.
- Das ist hilfreich, aber wir sind noch nicht dazu gekommen, um die Wurzel des Problems. Ich würde gerne wissen, warum es verwendet eine FTS, die statt eines Indexes.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Ausführungsplan auf jede Anweisung wird Ihnen mehr Details über das, was passiert ist. Versuchen Sie einige der angebotenen oracle-tools für die Untersuchung, was genau ist passiert in jedem Fall.
Versuchen Sie ein:
dann:
Diese geben Sie den tatsächlichen Ausführungsplan für die Erklärungen.
Durch die Art und Weise, werden Sie brauchen, wählen Sie auf der V_$SQL_PLAN und V_$SQL-Ansichten zur Verwendung der gather_plan_statistics wie oben.
Google für "explain plan", und überprüfen Sie den Ausführungsplan für beide Aussagen. Ohne die gesamte Funktion, ist es schwierig, etwas zu sagen. Aber ich würde davon ausgehen, dass der optimizer hat einige "Allgemeine Optimierung" auf die Ansicht, und wenn Sie aus der Ansicht auswählen, dass generische Optimierung verwendet wird. Wenn Sie wählen Sie direkt, ohne den Blick, der Optimierer berücksichtigt die Interna Ihrer Funktion als gut.
Erklären Sie planen, auf unterschiedliche Aussagen auswählen aus der Ansicht. Ist der "innere Teil", das führt die Funktion, die in jedem Fall dieselbe Person?