sql >> Database >  >> RDS >> Oracle

Hoe de Oracle Index-clusterfactor wordt berekend

Inhoudsopgave

Wat is Oracle index clustering factor (CF)?

De clusterfactor is een getal dat de mate aangeeft waarin gegevens willekeurig in een tabel zijn verdeeld in vergelijking met de geïndexeerde kolom. In eenvoudige bewoordingen is dit het aantal "blokschakelaars" tijdens het lezen van een tabel met behulp van een index.

Het is een belangrijke statistiek die een belangrijke rol speelt bij de berekening van de optimalisatie. Het wordt gebruikt om de berekening voor de indexbereikscans te wegen. Wanneer de clusterfactor hoger is, zijn de kosten van het scannen van het indexbereik hoger

Een goede clusterfactor is gelijk aan (of dichtbij) de waarden van het aantal blokken van de tabel.

Een slechte clusterfactor is gelijk aan (of bijna) aan het aantal rijen van de tabel.

Hoe wordt CF berekend?

Oracle berekent de clusterfactor door een volledige scan uit te voeren van de index die de bladblokken van begin tot eind laat lopen. Voor elk item in elk blad controleert Oracle het absolute bestandsnummer en de blok-ID, zoals verkregen uit de ROWID van de geïndexeerde waarde. Het houdt bij hoeveel 'verschillende' blokken gegevensrijen bevatten waarnaar door de index wordt verwezen. Het blokadres van het eerste item wordt vergeleken met het blokadres van het tweede item. Als het hetzelfde tabelblok is, verhoogt Oracle de teller niet. Als de tabelblokken verschillend zijn, voegt Oracle er één toe aan het aantal. Dit telproces gaat door van item tot item en vergelijkt altijd het vorige item met het huidige.

Het bovenstaande is een goed CF-voorbeeld, aangezien CF gelijk is aan het aantal blokken

Voorbeeld van slechte clusterfactor

Hier is de clusterfactor gelijk aan het aantal rijen

Deze manier van tellen heeft zijn eigen onverwachte uitkomst. Stel dat de gegevens worden ingevuld over een kleine set blokken, maar niet in de volgorde van de indexsleutel, dan kan het lijken alsof een set rijen zich over een grote set blokken bevindt, terwijl er misschien maar een paar echt verschillende blokken zijn . Dus CF zou hoger zijn, maar in feite raakt het maar heel weinig blokken. Dit probleem kan worden verholpen in 12c door tabelvoorkeuren te gebruiken en het in de tabel opgeslagen blok in de cache op te geven.

hoe de clusterfactor in Oracle te verbeteren

Het opnieuw opbouwen van een index zou geen effect hebben op de clusterfactor. De tabel moet worden gesorteerd en opnieuw worden opgebouwd om de clusterfactor te verlagen.

Query om de clusterfactor te bepalen 

CF wordt opgeslagen in de datadictionary en kan worden bekeken vanuit dba_indexes (of user_indexes).

In feite zijn alle indexstatistieken daar te vinden

SELECT index_name, index_type, uniqueness, blevel, leaf_blocks, distinct_keys, avg_leaf_blocks_per_key,
avg_data_blocks_per_key, clustering_factor, num_rows, sample_size, last_analyzed, partitioned
FROM dba_indexes
WHERE table_name = 'ORDERS' ;

Hoe de Oracle-indexclusterfactor van invloed is op het optimalisatieplan?

De clusterfactor is de primaire statistiek die de optimizer gebruikt om toegangspaden te indexeren. Het is een schatting van het aantal LIO's naar tabelblokken dat nodig is om alle rijen op te halen die voldoen aan de zoekopdracht. Hoe hoger de clusterfactor, hoe meer LIO's de optimizer nodig heeft. Hoe meer LIO's nodig zijn, hoe minder aantrekkelijk en dus duurder het gebruik van de index zal zijn.

Gerelateerd artikel
Oracle-partitie-index:Oracle-partitie-index begrijpen, wat is globale niet-gepartitioneerde indexen?, Wat zijn lokale vooraf ingestelde indexen, niet-voorgefixeerde lokale index
vind indexen op een tabel in orakel:bekijk dit artikel om vragen te vinden over hoe om indexen te vinden op een tabel in orakel, vermeld alle indexen in het schema, indexstatus, indexkolom
typen indexen in orakel:deze pagina bestaat uit informatie over orakelindexen, verschillende soorten indexen in orakel met een voorbeeld, hoe om de index in Oracle te creëren/laten vallen/wijzigen
Virtuele Index in Oracle:Wat is Virtuele Index in Oracle? Gebruik, beperking, voordeel en hoe te gebruiken om plan uit te leggen in Oracle-database, verborgen parameter _USE_NOSEGMENT_INDEXES


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

  2. Een berekende kolom toevoegen aan een bestaande tabel in SQL Server

  3. Een database importeren via de opdrachtregel

  4. Een menu maken in SQLPlus of PL/SQL