Ausführungsplan nicht wie erwartet

8

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?

    
sagi 07.12.2016, 13:08
quelle

3 Antworten

3

Es scheint, als gäbe es überhaupt keine Optimierung in der WHERE-Klausel des UPDATE.

%Vor% %Vor%

    
David דודו Markovitz 07.12.2016, 13:53
quelle
1

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:

%Vor%

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.

    
Kacper 07.12.2016 13:20
quelle
1

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

merge_update_clause

  

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.

    
Marmite Bomber 07.12.2016 14:41
quelle