sql >> Database >  >> RDS >> Oracle

Een goede gewoonte om omgekeerde indexen op surrogaatsleutels te gebruiken? (Orakel)

Als u RAC niet gebruikt, is er over het algemeen geen reden om een ​​reverse-key index te gebruiken.

Vanuit het oogpunt van prestaties ben je veel beter af met een of twee hot-blocks op een bepaald moment die onderhevig zijn aan inserties, omdat dat in wezen garandeert dat de hot-blocks in de buffercache en de INSERT staan. code> hoeft niet de kosten te maken om het blok van schijf te lezen. Als je inserts hebt die in willekeurige blokken in een index gaan, is de kans veel groter dat het gewenste blok uit de cache is verouderd en de kosten van een fysieke I/O met zich meebrengt.

De kosten om een ​​index in evenwicht te houden zijn vrij minimaal, maar zelfs dat is in het voordeel van een standaardindex. Als u een door een reeks gegenereerde primaire sleutel met een normale index heeft, zal Oracle een 90/10 bloksplitsing op het meest rechtse blok wanneer dat blok vol raakt. Als u daarentegen een reverse key-index heeft, moet Oracle 50/50 bloksplitsingen wanneer een bepaald blok vol raakt. Een 50/50 bloksplitsing kopieert de helft van de gegevens van het oude blok naar het nieuwe blok, een 90/10 bloksplitsing kopieert alleen de meest rechtse gegevenswaarde naar het nieuwe blok. De bloksplitsing van 90/10 is daarom veel goedkoper dan een 50/50 bloksplitsing en je zou ongeveer hetzelfde aantal bloksplitsingen moeten doen, ongeacht het type index dat je kiest. Dus de kosten van het onderhouden van een reguliere index zijn lager dan de kosten van het onderhouden van een reverse key-index, zelfs als het effect van cache wordt genegeerd.

De reden dat u zou overwegen om een ​​reverse key-index te gebruiken, is dat u RAC gebruikt en u de kosten wilt vermijden van het hebben van veel RAC-knooppunten die allemaal over hetzelfde hot block vechten. Als je constant het hot block van het ene knooppunt naar het andere moet verzenden om de volgende invoeging te doen, kan het de moeite waard zijn om in plaats daarvan een omgekeerde sleutelindex te gebruiken om die bewering te verminderen. Als u een licentie voor de partitioneringsoptie hebt, is het nog steeds beter om in plaats daarvan een hash-gepartitioneerde index te gebruiken (dit kan worden gedaan of de tabellen nu wel of niet zijn gepartitioneerd). Als u geen licentie voor de partitioneringsoptie hebt, kan een reverse key-index goed genoeg zijn om twist op het hot block op te lossen, zodat u geen licentie voor partitionering hoeft te nemen.




  1. mysql:heel eenvoudig SELECT id ORDER BY LIMIT gebruikt INDEX niet zoals verwacht (?!)

  2. Een nieuwe kolom toevoegen aan een bestaande tabel in SQL Server (T-SQL)

  3. Voeg meerdere rijen in met PDO voorbereide verklaringen

  4. Standaard tabelvergrendelingshint op SQL Server 2005/2008