2017-02-24 1 views
1

Ich habe eine Tabelle, die 100 Partitionen hat, Und ich habe eine Prozedur, die die Daten partitioniert liest. AngenommenOracle-Partition

P0 ist 1 Partition, wenn ich Prozedur ausführen

exec xyz('P0'); 

es dauert 3 Minuten für 500k Zeilen auszuführen.

Aber wenn ich 100 Sitzungen erstellen und parallel so etwas wie in verschiedenen verschiedenen Sitzungen

exec xyz('P1'); 
exec xyz('P2'); 
exec xyz('P3'); 

Es dauert 1 Stunde für 50M Reihen kann jemand erklären, warum sein Vorkommnis laufen.

+0

Es gibt keine konkreten Informationen über Ihr tatsächliches Szenario, daher ist es nicht wirklich möglich, die Antwort zu kennen. Dennoch gefällt mir die Frage, wie sie allgemein modifiziert wird, in einem größeren Bereich als die eigentliche Frage. –

Antwort

1

Soweit ich weiß, ist Ihre Erwartung, dass die Zeit für 100 Partitionen 100 * die Zeit für eine einzelne Partition benötigt, die 100 * 3 Minuten = 300 Minuten = 5 Stunden ist. Stattdessen dauert die gesamte Aufgabe nur 1 Stunde und 50 Minuten.

Die erste Frage ist, ob die Größe der Partitionen gleich ist. Vielleicht gibt es kleine Partitionen, die das eben beschriebene Verhalten erklären könnten.

Auch die Ausführungszeit auf einer bestimmten Partition hängt stark davon ab, was Ihre gespeicherte Prozedur tatsächlich macht. Zum Beispiel könnte es große Auswahl enthält, eine Menge Daten in den Speicher füllt in einigen Partitionen (die viel Zeit in Anspruch nimmt), während die anderen Partitionen in einer viel schnellen Art und Weise ausgeführt werden, wie Datensätze herausgefiltert werden, bevor das Schreiben ihre Inhalte in Erinnerung.

Außerdem kann die gespeicherte Prozedur Schreibvorgänge (Einfügen, Aktualisieren, Löschen) enthalten, die sehr zeitaufwändig sind, insbesondere wenn sie viele Datensätze betreffen. Es besteht eine hohe Wahrscheinlichkeit, dass die Verteilung der betroffenen Datensätze auf Ihre Partitionen ungleichmäßig ist und daher die Ausführungszeit in verschiedenen Partitionen unterschiedlich sein kann. Wenn Sie beispielsweise in jeder Partition ungefähr 500.000 Datensätze haben und Ihre gespeicherte Prozedur Datensätze anhand eines Kriteriums auswählt und ein bestimmtes Update für die Elemente durchführt, die den Kriterien entsprechen, besteht eine hohe Wahrscheinlichkeit, dass die Anzahl gefunden und beeinflusst wird Datensätze werden in den verschiedenen Partitionen unterschiedlich sein.

Oder die Partitionen sind auf Server mit unterschiedlichen Verzögerungen oder unterschiedlichen Eigenschaften verteilt, was sich auf die Gesamtzeit auswirkt. Oder die Server machen noch andere Aufgaben, was die Ausführungszeit pseudozufällig erhöht.

+0

Meine Erwartung ist, dies in 3 Minuten vollständig sein muss als 1 bis 3 Minuten dauert eine Partition zu vervollständigen und ich laufe all 100 durch parallele andere Sitzung. Und alle Partition sind fast gleich groß. – Sparsh

+0

@Sparsh Es ist nicht realistisch zu erwarten, dass sich die Leistung bei der Ausführung von 100 Threads um das 100fache verbessert. Ich bin nicht sicher, wie die endgültige Zahl sein sollte, aber erwarte nicht, dass X-Threads die X-fache Leistung liefern. Wie laufen die parallelen Jobs? Wenn Sie DBMS_SCHEDULER verwenden, ist es möglich, dass Sie durch den Parameter JOB_QUEUE_PROCESSES oder die Art und Weise eingeschränkt werden, in der Oracle die geplanten Jobs abhängig von der Auslastung häufig verringert. Wenn Leistung die höchste Priorität hat, möchten Sie in der Regel parallele Oracle-Anweisungen verwenden und Oracle die Parallelisierung durchführen lassen, anstatt eigene Jobs zu erstellen. –

+0

@Sparsh Ich habe die Frage missverstanden. Ich dachte, dass Sie die gespeicherte Prozedur aus irgendeinem Grund sequenziell ausführen.Sie können eine bessere Leistung erwarten, wenn Sie die Jobs parallel statt sequenziell ausführen, sodass viele Threads, die zur gleichen Zeit ausgeführt werden, den Serveraufwand erheblich erhöhen. Ihre Annahme wäre mehr oder weniger gültig, wenn dies auf 100 verschiedenen Computern ausgeführt würde. Da es sehr wahrscheinlich ist, dass dein Fall anders ist, also das Verhalten, das du erlebt hast. –