sql >> Database >  >> RDS >> Oracle

Inzicht in de resultaten van Execute Explain Plan in Oracle SQL Developer

De output van EXPLAIN PLAN is een debug-output van de query-optimizer van Oracle. De COST is de uiteindelijke output van de Cost-based optimizer (CBO), waarvan het doel is om te selecteren welke van de vele verschillende mogelijke plannen moeten worden gebruikt om de query uit te voeren. De CBO berekent een relatieve kostprijs voor elk plan en kiest vervolgens het plan met de laagste kosten.

(Opmerking:in sommige gevallen heeft de CBO niet genoeg tijd om elk mogelijk plan te evalueren; in deze gevallen kiest het gewoon het plan met de laagste tot nu toe gevonden kosten)

Over het algemeen is een van de grootste bijdragen aan een langzame zoekopdracht het aantal rijen dat wordt gelezen om de zoekopdracht te onderhouden (blokken, om preciezer te zijn), dus de kosten zullen gedeeltelijk worden gebaseerd. op het aantal rijen moeten de optimalisatieschattingen worden gelezen.

Stel dat u bijvoorbeeld de volgende vraag heeft:

SELECT emp_id FROM employees WHERE months_of_service = 6;

(De months_of_service kolom heeft een NOT NULL-beperking en een gewone index erop.)

Er zijn twee basisplannen die de optimizer hier kan kiezen:

  • Plan 1:Lees alle rijen uit de tabel "werknemers", controleer voor elk of het predikaat waar is (months_of_service=6 ).
  • Plan 2:Lees de index waar months_of_service=6 (dit resulteert in een set ROWID's) en open vervolgens de tabel op basis van de geretourneerde ROWID's.

Stel dat de tabel 'werknemers' 1.000.000 (1 miljoen) rijen heeft. Laten we ons verder voorstellen dat de waarden voor months_of_service variëren van 1 tot 12 en om de een of andere reden redelijk gelijk verdeeld zijn.

De kosten van Abonnement 1 , waarbij een VOLLEDIGE SCAN nodig is, zijn de kosten voor het lezen van alle rijen in de werknemerstabel, wat ongeveer gelijk is aan 1.000.000; maar aangezien Oracle de blokken vaak kan lezen met behulp van multi-block reads, zullen de werkelijke kosten lager zijn (afhankelijk van hoe uw database is ingesteld) - b.v. laten we ons voorstellen dat het aantal gelezen blokken 10 is - de berekende kosten van de volledige scan zullen 1.000.000/10 zijn; Totale kosten =100.000.

De kosten van Abonnement 2 , die een INDEX RANGE SCAN en een tabelzoekopdracht door ROWID omvat, zijn de kosten van het scannen van de index, plus de kosten van toegang tot de tabel door ROWID. Ik zal niet ingaan op de kosten van indexbereikscans, maar laten we ons voorstellen dat de kosten van de indexbereikscan 1 per rij zijn; we verwachten in 1 op de 12 gevallen een match te vinden, dus de kosten van de indexscan zijn 1.000.000 / 12 =83.333; plus de kosten voor toegang tot de tabel (veronderstel dat 1 blok wordt gelezen per toegang, we kunnen hier geen leesbewerkingen met meerdere blokken gebruiken) =83.333; Totale kosten =166.666.

Zoals u kunt zien, zijn de kosten van Plan 1 (volledige scan) MINDER dan de kosten van Plan 2 (indexscan + toegang via rowid) - wat betekent dat de CBO de VOLLEDIGE scan zou kiezen.

Als de veronderstellingen die hier door de optimizer zijn gemaakt waar zijn, dan heeft Plan 1 in feite de voorkeur en veel efficiënter dan Plan 2 - wat de mythe weerlegt dat VOLLEDIGE scans "altijd slecht" zijn.

De resultaten zouden heel anders zijn als het doel van de optimizer FIRST_ROWS(n) was in plaats van ALL_ROWS - in dat geval zou de optimizer de voorkeur geven aan Plan 2 omdat het vaak de eerste paar rijen sneller retourneert, ten koste van minder efficiënt voor de hele zoekopdracht .



  1. Voeg snel 2 miljoen rijen in SQL Server in

  2. Wanneer geërfde tabellen gebruiken in PostgreSQL?

  3. Het standaarddatabase-e-mailprofiel voor een gebruiker in SQL Server (T-SQL) wijzigen

  4. Hoe beïnvloeden NULL-waarden de prestaties bij het doorzoeken van een database?