it-swarm.it

ORA-01654: impossibile estendere l'indice <nome dell'indice> di 128 nel tablespace <nome del tablespace Indice>

Non sono un DBA ma devo risolvere questo problema.

Ci sono 2 tablespace permanenti nel mio database Oracle 9i. Uno per le tabelle e l'altro per gli indici diversi dai tablespace temporanei e UNDO

La scorsa settimana ho ricevuto l'eccezione

ORA-01654: impossibile estendere l'indice <name of the index> di 128 nel tablespace <name of the Index tablespace>.

Ho aumentato notevolmente le dimensioni del tablespace. Ma sto ancora ricevendo questo errore.

Ho cancellato molti dati pensando che avrebbe liberato un po 'di spazio. Ma non serve a niente.

Ridurre il tablespace o ridimensionare i file di dati del tablespace permanente risolverà questo problema?

Inoltre, le statistiche non sono state raccolte da marzo. La raccolta delle ultime statistiche mi aiuterà in qualche modo?

4
Savitha

L'eliminazione dei dati non farà alcuna differenza poiché Oracle avrà tenuto lo spazio pronto per essere riempito nuovamente. L'utilizzo dello spazio superiore in una tabella è noto come high water mark. Tom Kyte ha n ottimo post a riguardo .

Riduci il high water mark ricostruendo la tabella:

alter table my_table_name move;

Se stai ancora riscontrando l'errore dopo aver aumentato le dimensioni del tablespace, ci sono un paio di possibili motivi ...

  1. L'indice è troppo grande anche per il tablespace appena aumentato. Quanto è grande la tabella e quali sono le dimensioni combinate delle colonne che stai indicizzando?
  2. Non stai specificando un tablespace durante la creazione dell'indice e non sta usando quello che pensi, qualunque sia il tablespace predefinito per il tuo schema.

La risposta a 1 a è aggiungere più spazio.

Per scoprire il tuo tablespace predefinito:

select * from dba_users where username = 'MY_USER'

Se questo non è il tablespace dell'indice, è necessario specificarlo durante la creazione dell'indice.

create index i_my_table 
    on my_table ( my_column ) 
       tablespace my_index_ts
       < other options >

Sì, se sei in 9i vale sicuramente la pena raccogliere statistiche in quanto non le raccoglie automaticamente quando sono state apportate sufficienti modifiche alla tabella - lo fa nelle versioni successive. Usa DBMS_STATS.GATHER_TABLE_STATS() e fallo solo dopo ricostruendo la tabella.

Purtroppo in Oracle non è possibile ridurre la dimensione di un tablespace. Per usare questa opzione dovresti ricreare il tablespace, ma più piccolo, e spostare tutto su di esso.

8
Ben

Puoi recuperare un po 'di spazio sui tuoi tavoli più grandi con:

ALTER TABLE xxx ENABLE ROW MOVEMENT
ALTER TABLE xxx SHRINK SPACE
ALTER TABLE xxx DISABLE ROW MOVEMENT

Nota che probabilmente dovrai ricostruire alcuni oggetti dopo quello.

2
Benoit