Oracle
 sql >> Database >  >> RDS >> Oracle

la colonna incrementata rende sbilanciato l'indice b-tree sulla colonna?

Oracle gli indici di 's non sono mai "sbilanciati":ogni foglia nell'indice ha la stessa profondità di qualsiasi altra foglia.

Nessuna divisione di pagina introduce di per sé un nuovo livello:una pagina foglia non diventa genitore per nuove pagine come sarebbe su un albero non autobilanciato.

Invece, viene creato un fratello per la pagina divisa e il nuovo record (più eventualmente alcuni dei record della vecchia pagina) passa alla nuova pagina. Un puntatore alla nuova pagina viene aggiunto al genitore.

Se anche la pagina principale ha esaurito lo spazio (non può accettare il puntatore alla pagina foglia appena creata), anche questa viene divisa e così via.

Queste divisioni possono propagarsi fino alla pagina principale, la cui divisione è l'unica cosa che aumenta la profondità dell'indice (e lo fa per tutte le pagine contemporaneamente).

Le pagine dell'indice sono inoltre organizzate in elenchi a doppio collegamento, ciascuno al proprio livello. Questo sarebbe impossibile se l'albero fosse sbilanciato.

Se master_id viene incrementato automaticamente questo significa che tutte le divisioni si verificano alla fine (chiamate 90/10 splits) che rende possibile l'indice più denso.

No, non lo sarebbe, per i motivi di cui sopra.

Se ti unisci a slave a master spesso potresti considerare di creare un CLUSTER delle due tabelle, indicizzate da master_id . Ciò significa che i record di entrambe le tabelle condividono lo stesso master_id , vai alle stesse pagine di dati o nelle vicinanze che rendono molto veloce un join tra di loro.

Quando il motore ha trovato un record da master , con un indice o altro, significa anche che ha già trovato i record da slave per essere unito a quel master . E viceversa, individuare uno slave significa anche individuare il suo master .