Suche…


Parameter

Parameter Einzelheiten
Parallelitätsgrad (DOP) Es ist die Anzahl paralleler Verbindungen / Prozesse, die Ihre Abfrage öffnen soll. Es ist normalerweise 2, 4, 8, 16 so weiter.
Tabellenname Der Name der Tabelle, auf die der Parallelhinweis angewendet wird.

Paralleler Hinweis

Parallele Hinweise auf Anweisungsebene sind am einfachsten:

SELECT /*+ PARALLEL(8) */ first_name, last_name FROM employee emp;

Parallele Hinweise auf Objektebene geben mehr Kontrolle, sind aber anfälliger für Fehler. Entwickler vergessen häufig, den Aliasnamen anstelle des Objektnamens zu verwenden, oder vergessen, einige Objekte einzuschließen.

SELECT /*+ PARALLEL(emp,8) */ first_name, last_name FROM employee emp;

SELECT /*+ PARALLEL(table_alias,Degree of Parallelism) */ FROM table_name table_alias;

Angenommen, es dauert 100 Sekunden, bis eine Abfrage ausgeführt wird, ohne einen parallelen Hinweis zu verwenden. Wenn wir DOP für dieselbe Abfrage auf 2 ändern, dauert die Abfrage mit Parallelhinweis idealerweise 50 Sekunden. Die Verwendung von DOP als 4 dauert ebenfalls 25 Sekunden.

In der Praxis hängt die parallele Ausführung von vielen anderen Faktoren ab und skaliert nicht linear. Dies gilt insbesondere für kleine Laufzeiten, bei denen der parallele Overhead möglicherweise größer ist als die Gewinne, die auf mehreren parallelen Servern auftreten.

USE_NL

Verwenden Sie verschachtelte Schleifen.

Verwendung: use_nl(AB)

Dieser Hinweis fordert die Engine auf, die Tabellen A und B mit der Nested-Loop-Methode zu verknüpfen. Der Hinweis erzwingt nicht die Reihenfolge der Verknüpfung, fragt nur nach NL.

SELECT /*+use_nl(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID

APPEND TIPP

Msgstr "Verwenden Sie die Methode DIRECT PATH zum Einfügen neuer Zeilen".

Der APPEND Hinweis weist die Engine an, die direkte APPEND zu verwenden. Dies bedeutet, dass die Engine keine herkömmliche Einfügung verwendet, die Speicherstrukturen und Standardsperren verwendet, sondern die Daten direkt in den Tablespace schreibt. Erstellt immer neue Blöcke, die an das Tabellensegment angehängt werden. Dies wird schneller sein, hat aber einige Einschränkungen:

  • Sie können nicht aus der Tabelle lesen, die Sie in derselben Sitzung angefügt haben, bis Sie die Transaktion übertragen oder zurücksetzen.
  • Wenn in der Tabelle Auslöser definiert sind, verwendet Oracle keinen direkten Pfad (dies ist eine andere Geschichte für das Laden von sqlldr).
  • Andere

Beispiel.

INSERT /*+append*/ INTO Employees
SELECT *
FROM Employees;

USE_HASH

Weist die Engine an, die Hash-Methode zum Verknüpfen von Tabellen im Argument zu verwenden.

Verwendung: use_hash(TableA [TableB] ... [TableN])

Wie bereits an vielen Stellen erläutert , "greift Oracle in einem HASH-Join auf eine Tabelle (normalerweise auf das kleinere der verbundenen Ergebnisse) auf und erstellt eine Hashtabelle für den Join-Schlüssel im Speicher. Dann durchsucht er die andere Tabelle im Join (normalerweise die größere) one) und prüft die Hashtabelle auf Übereinstimmungen. "

Dies ist der Nested Loops-Methode vorzuziehen, wenn die Tabellen groß sind, keine Indizes vorhanden sind usw.

Hinweis : Der Hinweis erzwingt nicht die Reihenfolge der Verknüpfung, sondern fragt nur nach der HASH JOIN-Methode.

Verwendungsbeispiel:

SELECT /*+use_hash(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID

VOLL

Der FULL-Hinweis weist Oracle an, eine vollständige Tabellensuche für eine angegebene Tabelle durchzuführen, unabhängig davon, ob ein Index verwendet werden kann.

create table fullTable(id) as select level from dual connect by level < 100000;
create index idx on fullTable(id);

Ohne Hinweise wird der Index verwendet:

select count(1) from fullTable f where id between 10 and 100;
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    13 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE   |      |     1 |    13 |            |          |
|*  2 |   INDEX RANGE SCAN| IDX  |     2 |    26 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

FULL-Hinweis erzwingt einen vollständigen Scan:

select /*+ full(f) */ count(1) from fullTable f where id between 10 and 100;
--------------------------------------------------------------------------------
| Id  | Operation          | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |           |     1 |    13 |    47   (3)| 00:00:01 |
|   1 |  SORT AGGREGATE    |           |     1 |    13 |            |          |
|*  2 |   TABLE ACCESS FULL| FULLTABLE |     2 |    26 |    47   (3)| 00:00:01 |
--------------------------------------------------------------------------------

Ergebnis-Cache

Oracle ( 11g und höher ) ermöglicht, dass die SQL-Abfragen im SGA zwischengespeichert und zur Verbesserung der Leistung wiederverwendet werden. Es fragt die Daten aus dem Cache ab und nicht aus der Datenbank. Die anschließende Ausführung derselben Abfrage ist schneller, da die Daten jetzt aus dem Cache gezogen werden.

SELECT /*+ result_cache */ number FROM main_table;

Ausgabe -

Number
------
   1
   2
   3
   4
   5
   6
   7
   8
   9
   10

Elapsed: 00:00:02.20

Wenn ich dieselbe Abfrage jetzt erneut ausführen, wird die Ausführungszeit reduziert, da die Daten jetzt aus dem Cache abgerufen werden, der bei der ersten Ausführung festgelegt wurde.

Ausgabe -

Number
------
   1
   2
   3
   4
   5
   6
   7
   8
   9
   10

Elapsed: 00:00:00.10

Beachten Sie, wie die verstrichene Zeit von 2,20 Sekunden auf 0,10 Sekunden gesunken ist.

Ergebnis Der Cache speichert den Cache, bis die Daten in der Datenbank aktualisiert / geändert / gelöscht wurden. Bei jeder Änderung wird der Cache freigegeben.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow