Szukaj…


Parametry

Parametry Detale
Stopień równoległości (DOP) Jest to liczba równoległych połączeń / procesów, które mają zostać otwarte w zapytaniu. Zazwyczaj jest to 2, 4, 8, 16 itd.
Nazwa tabeli Nazwa tabeli, do której zostanie zastosowana podpowiedź równoległa.

Wskazówka równoległa

Podpowiedzi na poziomie instrukcji są najłatwiejsze:

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

Równoległe wskazówki na poziomie obiektu dają większą kontrolę, ale są bardziej podatne na błędy; programiści często zapominają używać aliasu zamiast nazwy obiektu lub zapominają o dołączeniu niektórych obiektów.

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

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

Powiedzmy, że wykonanie zapytania zajmuje 100 sekund bez użycia równoległej wskazówki. Jeśli zmienimy DOP na 2 dla tego samego zapytania, wówczas idealnie to samo zapytanie z równoległą wskazówką zajmie 50 sekund. Podobnie użycie DOP jako 4 zajmie 25 sekund.

W praktyce wykonywanie równoległe zależy od wielu innych czynników i nie jest skalowane liniowo. Jest to szczególnie prawdziwe w przypadku małych czasów uruchamiania, w których obciążenie równoległe może być większe niż zyski z działania na wielu serwerach równoległych.

USE_NL

Użyj zagnieżdżonych pętli.

Zastosowanie: use_nl(AB)

Ta wskazówka poprosi silnik o użycie metody zagnieżdżonej pętli w celu połączenia tabel A i B. To porównanie rzędów. Podpowiedź nie wymusza kolejności łączenia, tylko prosi o NL.

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

DODATEK WSKAZÓWKA

„Użyj metody DIRECT PATH do wstawiania nowych wierszy”.

Wskazówka APPEND instruuje silnik, aby używał bezpośredniego obciążenia ścieżki . Oznacza to, że silnik nie użyje konwencjonalnej wstawki wykorzystującej struktury pamięci i standardowe blokady, ale zapisze dane bezpośrednio w obszarze tabel. Zawsze tworzy nowe bloki, które są dołączane do segmentu tabeli. Będzie to szybsze, ale będzie miało pewne ograniczenia:

  • Nie można odczytać z tabeli dołączonej w tej samej sesji, dopóki transakcja nie zostanie zatwierdzona lub wycofana.
  • Jeśli w tabeli zdefiniowano wyzwalacze, Oracle nie użyje bezpośredniej ścieżki (to inna historia dla obciążeń sqlldr).
  • inni

Przykład.

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

USE_HASH

Nakazuje silnikowi użycie metody skrótu do łączenia tabel w argumencie.

Użycie: use_hash(TableA [TableB] ... [TableN])

Jak wyjaśniono w wielu miejscach , „w złączeniu HASH Oracle uzyskuje dostęp do jednej tabeli (zwykle mniejszy z połączonych wyników) i buduje tablicę skrótów na kluczu złączenia w pamięci. Następnie skanuje drugą tabelę w złączeniu (zwykle większy jeden) i sprawdza tabelę skrótów w celu dopasowania do niej. ”

Preferowana jest metoda Nested Loops, gdy tabele są duże, nie ma pod ręką żadnych indeksów itp.

Uwaga : podpowiedź nie wymusza kolejności łączenia, tylko prosi o metodę HASH JOIN.

Przykład użycia:

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

PEŁNY

WSKAZÓWKA PEŁNA mówi Oracle, aby wykonała pełne skanowanie tabeli na określonej tabeli, bez względu na to, czy można użyć indeksu.

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

Bez podpowiedzi używany jest indeks:

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 |
--------------------------------------------------------------------------

PEŁNA wskazówka wymusza pełne skanowanie:

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 |
--------------------------------------------------------------------------------

Pamięć podręczna wyników

Oracle (11 g i więcej ) umożliwia buforowanie zapytań SQL w SGA i ponowne ich użycie w celu poprawy wydajności. Odpytuje dane z pamięci podręcznej, a nie z bazy danych. Kolejne wykonanie tego samego zapytania jest szybsze, ponieważ teraz dane są pobierane z pamięci podręcznej.

SELECT /*+ result_cache */ number FROM main_table;

Wynik -

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

Elapsed: 00:00:02.20

Jeśli teraz ponownie uruchomię to samo zapytanie, czas wykonania skróci się, ponieważ dane są teraz pobierane z pamięci podręcznej ustawionej podczas pierwszego wykonania.

Wynik -

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

Elapsed: 00:00:00.10

Zauważ, jak upłynął czas, który upłynął z 2,20 sekundy do 0,10 sekundy .

Wynik Pamięć podręczna przechowuje pamięć podręczną, dopóki dane w bazie danych nie zostaną zaktualizowane / zmienione / usunięte. Każda zmiana spowoduje zwolnienie pamięci podręcznej.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow