Ich bin auf etwas Seltsames gestoßen, das ich nicht erklären kann.
Ich verwende die folgende Abfrage:
%Vor%Stg_Table: Indiziert (Site_Id)
Haupttabelle:
- Indiziert (Period_code, Site_id)
- Von period_code partitioniert
- Hinweis - Ich habe versucht, einen Index für Site_Id
allein, denselben Ausführungsplan hinzuzufügen.
Ich würde einen Ausführungsplan erwarten, der den Scan einer einzelnen Partition verwendet, aber stattdessen bekomme ich Partition list all
.
Dies ist der Ausführungsplan:
%Vor% BEARBEITEN: Zur Klarstellung, wenn es nicht klar war, ich suche keine Antwort darauf, wie Oracle nur eine einzige Partition scannen kann, weiß ich bereits, dass ich% co_de platziere % in der t.period_code = 201612
-Klausel ist in Ordnung. Meine Frage ist - Warum evaluiert Oracle nicht die ON
-Klausel, die nur die spezifische Partition filtern soll?
Ziehen Sie in Betracht, t.period_code = 201612
in die Bedingung " on (t.period_code = 201612 and s.site_id = t.site_id)
" zu verschieben. Ich denke, Ihre Abfrage versucht, auf alle Partitionen PARTITION LIST ALL
zuzugreifen, und das ist das Problem.
Wenn Sie die Bedingung hinzufügen, dass der Zugriff auf eine einzelne Partition aktiviert ist, sollte es besser laufen.
Eine andere Option ist:
%Vor%Um direkt darauf hinzuweisen, dass das Update nur für eine Partition gilt.
BEARBEITEN
Ok, versuche also die Frage zu beantworten, warum. Oracle kann zwei Bedingungen nicht zu einer kombinieren. where
enthält Informationen zur Partition, aber um where
auf verbundene Daten anzuwenden, muss zuerst ON
condition angewendet werden. Aber zu diesem Zeitpunkt hat es keine Informationen über die Partition nur site_id
, also entscheidet es, alle Partitionen zu scannen. Sie müssen Oracle im ersten Schritt informieren (welches on
verbindet), welche Partition Sie verwenden möchten.
Mit anderen Worten, um where
anzuwenden, das zuerst Informationen über die Partition enthält, muss es aufgelöst werden:
und hier müssen Sie auf alle Partitionen zugreifen. where
ist ein Teil von when matched
, also müssen wir zuerst feststellen, ob es eine Übereinstimmung gibt oder nicht, ohne Kenntnis über Partitionen.
Es sollte unterschieden werden zwischen WHERE clause
der Merge insert / update-Klausel und WHERE clause
der SELECT-Anweisung.
Die MERGE-Klauseln sind im Allgemeinen saing - nicht UPDATE oder nicht INSERT . Eine Generation von ACCESS-Prädikaten ist im Allgemeinen nicht trivial.
Wie andere im einfachsten Fall mit nur einer UPDATE WHERE-Klausel angegeben haben, wird ab 11g keine ACCESS-Prädikatgenerierung durchgeführt.
Es sind auch Dokumente als solche
Geben Sie where_clause an, wenn die Datenbank den Aktualisierungsvorgang nur ausführen soll, wenn die angegebene Bedingung wahr ist. Die Bedingung kann sich entweder auf die Datenquelle oder die Zieltabelle beziehen. Wenn die Bedingung nicht zutrifft, überspringt die Datenbank die Aktualisierungsoperation beim Zusammenführen der Zeile in die Tabelle.
d. Das Prädikat skipps das Update nicht einen Datensatz in Zeile Quelle.
Tags und Links sql oracle performance sql-execution-plan