Sök…


parametrar

parametrar detaljer
Parallelism (DOP) Det är antalet parallella anslutningar / processer som du vill att din fråga ska öppna. Det är vanligtvis 2, 4, 8, 16 osv.
Tabellnamn Namnet på tabellen på vilken parallelltips kommer att tillämpas.

Parallell tips

Parallelltips på uttalandenivå är de enklaste:

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

Parallell tips på objektnivå ger mer kontroll men är mer benägna att göra fel; utvecklare glömmer ofta att använda alias istället för objektnamnet, eller de glömmer att ta med några objekt.

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

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

Låt oss säga att en fråga tar 100 sekunder att köra utan att använda parallellt ledtråd. Om vi ändrar DOP till 2 för samma fråga, kommer idealiskt samma fråga med parallellt led att ta 50 sekunder. På liknande sätt tar det 25 sekunder att använda DOP som 4.

I praktiken är parallellkörning beroende av många andra faktorer och skalas inte linjärt. Detta gäller särskilt för små körtider där det parallella omkostnaden kan vara större än vinsterna från att köra i flera parallella servrar.

USE_NL

Använd kapslade slingor.

Användning: use_nl(AB)

Detta tips kommer att be motorn att använda kapslad slingmetod för att gå med i tabellerna A och B. Det är jämförelse rad för rad. Tipset tvingar inte ordningen på sammanfogningen, ber bara om NL.

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

BILAGA TIPS

"Använd metoden DIRECT PATH för att infoga nya rader".

APPEND instruerar motorn att använda direkt vägbelastning . Detta innebär att motorn inte kommer att använda ett konventionellt skär med minnesstrukturer och standardlås, utan kommer att skriva direkt till tabellområdet data. Skapar alltid nya block som läggs till i tabellens segment. Detta kommer att vara snabbare, men har några begränsningar:

  • Du kan inte läsa från tabellen du bifogade i samma session förrän du skickar in eller återför transaktionen.
  • Om det finns triggers definierade på bordet kommer Oracle inte att använda direktväg (det är en annan historia för sqlldr-laster).
  • andra

Exempel.

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

USE_HASH

Instruerar motorn att använda hashmetod för att gå med tabeller i argumentet.

Användning: use_hash(TableA [TableB] ... [TableN])

Som förklaratsmånga ställen , "i en HASH-anslutning, får Oracle åtkomst till ett bord (vanligtvis det mindre av de sammanfogade resultaten) och bygger ett hashtabell på kopplingsnyckeln i minnet. Det skannar sedan det andra bordet i kopplingen (vanligtvis det större en) och undersöker hashtabellen för matchningar till den. "

Det är att föredra mot Nested Loops-metoden när tabellerna är stora, inga index finns till hands, etc.

Obs : Tipset tvingar inte sammanfogningens ordning, ber bara om HASH JOIN-metoden.

Exempel på användning:

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

FULL

FULL-antydningen berättar för Oracle att utföra en fullständig tabellscanning på ett specificerat bord, oavsett om ett index kan användas.

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

Med inga tips används indexet:

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 antydning tvingar en fullständig genomsökning:

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

Resultatcache

Oracle ( 11g och högre ) gör att SQL-frågor kan cachelagras i SGA och återanvändas för att förbättra prestandan. Det frågar data från cache snarare än databas. Efterföljande exekvering av samma fråga är snabbare eftersom nu data dras från cache.

SELECT /*+ result_cache */ number FROM main_table;

Utgång -

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

Elapsed: 00:00:02.20

Om jag kör samma fråga igen nu kommer tiden att köra att minska eftersom data nu hämtas från cache som ställdes in under den första exekveringen.

Utgång -

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

Elapsed: 00:00:00.10

Lägg märke till hur den förflutna tiden minskade från 2,20 sekunder till 0,10 sekunder .

Resultatcache håller cachen tills data i databasen uppdateras / ändras / raderas. Alla ändringar kommer att släppa cachen.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow