Oracle Database
hints
Zoeken…
parameters
parameters | Details |
---|---|
Mate van parallellisme (DOP) | Het is het aantal parallelle verbindingen / processen dat u wilt dat uw query opent. Het is meestal 2, 4, 8, 16 enzovoort. |
Tafel naam | De naam van de tabel waarop een parallelle hint wordt toegepast. |
Parallelle hint
Parallelle hints op stellingniveau zijn het gemakkelijkst:
SELECT /*+ PARALLEL(8) */ first_name, last_name FROM employee emp;
Parallelle hints op objectniveau geven meer controle, maar zijn meer vatbaar voor fouten; ontwikkelaars vergeten vaak de alias te gebruiken in plaats van de objectnaam, of vergeten enkele objecten op te nemen.
SELECT /*+ PARALLEL(emp,8) */ first_name, last_name FROM employee emp;
SELECT /*+ PARALLEL(table_alias,Degree of Parallelism) */ FROM table_name table_alias;
Stel dat een zoekopdracht 100 seconden duurt om uit te voeren zonder parallelle hint te gebruiken. Als we DOP wijzigen in 2 voor dezelfde query, duurt het idealiter dezelfde query met parallelle hint 50 seconden. Op dezelfde manier duurt het gebruik van DOP als 4 25 seconden.
In de praktijk hangt parallelle uitvoering van veel andere factoren af en schaalt niet lineair. Dit geldt met name voor kleine runtijden waarbij de parallelle overhead groter kan zijn dan de voordelen van het draaien op meerdere parallelle servers.
USE_NL
Gebruik geneste lussen.
Gebruik: use_nl(AB)
Deze hint vraagt de motor om de geneste lusmethode te gebruiken om de tabellen A en B samen te voegen. Dat is rij voor rij vergelijken. De hint dwingt de volgorde van de join niet, vraagt alleen om NL.
SELECT /*+use_nl(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID
HINT TOEVOEGEN
"Gebruik de DIRECT PATH methode voor het invoegen van nieuwe rijen".
De APPEND
hint instrueert de motor om directe APPEND
te gebruiken. Dit betekent dat de engine geen conventionele insert gebruikt met geheugenstructuren en standaardvergrendelingen, maar de gegevens rechtstreeks naar de tabelruimte schrijft. Creëert altijd nieuwe blokken die aan het segment van de tabel worden toegevoegd. Dit gaat sneller, maar heeft enkele beperkingen:
- U kunt niet lezen uit de tabel die u in dezelfde sessie hebt toegevoegd totdat u de transactie hebt bevestigd of teruggedraaid.
- Als er triggers in de tabel zijn gedefinieerd, gebruikt Oracle geen direct pad (het is een ander verhaal voor sqlldr-ladingen).
- anderen
Voorbeeld.
INSERT /*+append*/ INTO Employees
SELECT *
FROM Employees;
USE_HASH
Instrueert de motor om de hash-methode te gebruiken om tabellen in het argument samen te voegen.
Gebruik: use_hash(TableA [TableB] ... [TableN])
Zoals op veel plaatsen is uitgelegd , "opent Oracle in een HASH-join één tabel (meestal de kleinere van de samengevoegde resultaten) en bouwt een hashtabel op de join-toets in het geheugen. Het scant vervolgens de andere tabel in de join (meestal de grotere one) en tast de hashtabel af op overeenkomsten. "
Het heeft de voorkeur tegen de Nested Loops-methode wanneer de tabellen groot zijn, er geen indexen bij de hand zijn, enz.
Opmerking : de hint forceert niet de volgorde van de join, maar vraagt alleen om de HASH JOIN-methode.
Voorbeeld van gebruik:
SELECT /*+use_hash(e d)*/ *
FROM Employees E
JOIN Departments D on E.DepartmentID = D.ID
FULL
De VOLLEDIGE hint vertelt Oracle om een volledige tabelscan uit te voeren op een specifieke tafel, ongeacht of een index kan worden gebruikt.
create table fullTable(id) as select level from dual connect by level < 100000;
create index idx on fullTable(id);
Zonder hints wordt de index gebruikt:
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 |
--------------------------------------------------------------------------
VOLLEDIGE hint forceert een volledige 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 |
--------------------------------------------------------------------------------
Resultaat Cache
Met Oracle (11 g en hoger ) kunnen SQL-query's in de SGA worden gecached en opnieuw worden gebruikt om de prestaties te verbeteren. Het vraagt de gegevens uit de cache in plaats van de database. De daaropvolgende uitvoering van dezelfde query is sneller omdat nu de gegevens uit de cache worden gehaald.
SELECT /*+ result_cache */ number FROM main_table;
Uitgang -
Number
------
1
2
3
4
5
6
7
8
9
10
Elapsed: 00:00:02.20
Als ik nu opnieuw dezelfde query voer, wordt de tijd om uit te voeren korter omdat de gegevens nu uit de cache worden opgehaald die tijdens de eerste uitvoering is ingesteld.
Uitgang -
Number
------
1
2
3
4
5
6
7
8
9
10
Elapsed: 00:00:00.10
Merk op hoe de verstreken tijd is teruggebracht van 2,20 seconden naar 0,10 seconden .
Resultaat Cache bewaart de cache totdat de gegevens in de database zijn bijgewerkt / gewijzigd / verwijderd. Bij elke wijziging wordt de cache vrijgegeven.