Begrenzen Sie den Grad der Parallelität (DOP), der für jede Abfrage verfügbar ist


11

Unter Oracle Exadata (11gR2) haben wir eine relativ umfangreiche Datenbank.

  • cpu_count ist 24
  • parallel_server_instances ist 2
  • parallel_threads_per_cpu ist 2

Durch Beobachtung in Oracle Enterprise Manager (OEM) haben wir festgestellt, dass die Leistung aufgrund der seriellen Ausführung von Abfragen schrecklich war. Um dies zu beheben, wurden alle Tabellen, materialisierten Ansichten und Indizes geändert, um die Parallelität zu nutzen. z.B:

ALTER TABLE SOME_TABLE PARALLEL (DEGREE DEFAULT INSTANCES DEFAULT);

Das System wurde geändert, um die Parallelisierung zu aktivieren:

ALTER SYSTEM SET PARALLEL_DEGREE_POLICY = 'AUTO';

Dies führte zu einer besseren Leistung, aber wir beobachteten gelegentlich bei OEM, dass eine einzelne Abfrage einen DOP von 96 (die gesamte verfügbare Ressource) bindet. Dies führte dazu, dass nachfolgende Abfragen auf einen DOP von 1 herabgestuft wurden (keine Parallelisierung). Dies führt zu einer schlechten Leistung, bis die Hogging-Abfrage abgeschlossen ist.

Um dies zu beheben, haben wir versucht, den verfügbaren DOP auf jede Abfrage zu beschränken mit:

ALTER SYSTEM SET PARALLEL_DEGREE_LIMIT = 24;

Dies hatte keine Wirkung. Wir beobachten häufig Abfragen, die mehr als das Limit verwenden (im Allgemeinen 48 oder 96, aber kein reales Muster).

Wie verhindern wir, dass eine einzelne Abfrage die gesamte verfügbare Ressource belastet?

Antworten:


8

Parallele Serversätze : PARALLEL_DEGREE_LIMIT begrenzt den Grad der Parallelität. Wenn Ihre Abfrage jedoch sortiert oder gruppiert, kann die Anzahl der parallelen Prozesse doppelt so hoch sein (zwei Serversätze, um die Parallelität zwischen Prozessen zu ermöglichen). Dies erklärt, warum Sie 48 parallele Prozesse auch bei einem Limit von 24 sehen. Dies geschieht auch, wenn Sie den Ressourcenmanager verwenden, um den DOP zu begrenzen.

Parallele Hinweise: PARALLEL_DEGREE_LIMIT gilt nur für Anweisungen, die den automatischen Parallelitätsgrad verwenden. Alle Anweisungen, die einen fest codierten Grad oder sogar einen parallelen Hinweis auf Objektebene verwenden, ignorieren das Limit. Wenn Sie diese Hinweise haben, könnte dies erklären, warum Sie 96 manchmal sehen.

E / A kalibrieren: Möglicherweise wird kein automatischer DOP verwendet, und daher wird der Grenzwert nicht eingehalten, da die E / A nicht kalibriert wurde . Diese Abfrage zeigt an, ob das E / A kalibriert wurde:

select * from V$IO_CALIBRATION_STATUS;

Ich habe gesehen, dass dies Probleme verursacht, aber mein aktuelles System ist nicht kalibriert und der automatische DOP scheint gut zu funktionieren. Ob dies wirklich ein Problem ist, können Sie im Abschnitt Notizen des Erklärungsplans erkennen. Wenn du so etwas - automatic DOP: Computed Degree of Parallelism is 2siehst, geht es dir gut, aber du willst es nicht sehen automatic DOP: skipped because of IO calibrate statistics are missing.

PARALLEL_MAX_SERVERS erhöhen: Anstatt sich Sorgen zu machen, dass die parallelen Server ausgehen, würde ich empfehlen, PARALLEL_MAX_SERVERS erheblich zu erhöhen. Sie sollten mindestens versuchen, zum Standardwert PARALLEL_THREADS_PER_CPU x CPU_COUNT x concurrent_parallel_users x 5 zwischen 240 und 960 zurückzukehren, abhängig von Ihren Speichereinstellungen.

Diese hohen Zahlen klingen für viele Datenbankadministratoren lächerlich, machen aber aus folgenden Gründen sehr viel Sinn:

  • Oracle-Parallelserver sind leichter als die meisten Leute annehmen. (Und kaum jemand testet es jemals, sie finden nur eine Situation, in der ein großer DOP ein Problem verursacht, und gehen davon aus, dass ein hoher DOP immer schlecht ist.)
  • Es ist üblich, eine Ad-hoc-Abfrage in einem GUI-Tool auszuführen, das nur die ersten 50 Zeilen abruft, aber immer noch Dutzende paralleler Server verwendet. Diese Abfragen verbrauchen KEINE signifikanten Ressourcen, es sei denn, PARALLEL_MAX_SERVERS ist zu niedrig. Dann werden die Leute angeschrien, weil sie absolut vernünftige Abfragen ausführen, was zu hässlichen Situationen führen kann.
  • Ein sehr großer DOP für eine einzelne Abfrage ist nicht immer schlecht. Jeder geht davon aus, dass der Overhead zu hoch wird und die Leistung erheblich sinkt, wenn Sie den DOP weiter erhöhen. Aber auf vielen Systemen habe ich festgestellt, dass selbst ein lächerlich hoher DOP zu einer besseren Leistung führt, obwohl die Renditen definitiv sinken und es gegenüber anderen Sitzungen sehr unfair sein kann. Aber raten Sie nicht nur, testen Sie es; Nehmen Sie eine Abfrage und führen Sie sie mit allen Arten von DOPs aus, bis zu 1000. Sie werden überrascht sein.
  • Ja, zu viel Parallelität kann schlecht sein. Aber was ist schlimmer für das System, wenn es etwas mehr als die optimale Anzahl von Sitzungen hat oder eine Abfrage auf seriell erzwingt und im Grunde genommen einen wichtigen Job beendet? Sie sollten das System überwachen, bevor Sie beliebige Grenzwerte einführen.

Beeindruckend! Vielen Dank, hier gibt es viel zu beachten und sehr nützliche Ratschläge.
Granate
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.