it-swarm.asia

ORA-01654: tidak dapat memperluas indeks <nama indeks> oleh 128 di tablespace <nama indeks tablespace>

Saya bukan seorang DBA tetapi harus menyelesaikan masalah ini.

Ada 2 tablespace permanen di database Oracle 9i saya. Satu untuk tabel dan yang lainnya untuk indeks selain dari tablespace sementara dan UNDO

Minggu lalu saya mendapat pengecualian

ORA-01654: tidak dapat memperpanjang indeks <name of the index> oleh 128 di tablespace <name of the Index tablespace>.

Saya mendapatkan ukuran tablespace meningkat pesat. Namun saya masih mendapatkan kesalahan ini.

Saya menghapus banyak pemikiran data yang akan membebaskan beberapa ruang. Tapi itu tidak ada gunanya.

Apakah menyusutkan tablespace atau mengubah ukuran file data tablespace permanen menyelesaikan masalah ini?

Selain itu, statistik belum dikumpulkan sejak Maret. Akankah mengumpulkan statistik terbaru membantu saya dengan cara apa pun?

4
Savitha

Menghapus data tidak akan membuat perbedaan karena Oracle akan membuat ruang siap untuk diisi ulang. Penggunaan ruang teratas dalam tabel dikenal sebagai tanda air tinggi. Tom Kyte memiliki pos yang bagus tentang it .

Anda mengurangi tanda air tinggi dengan membangun kembali tabel:

alter table my_table_name move;

Jika Anda masih mendapatkan kesalahan setelah meningkatkan ukuran tablespace ada beberapa alasan yang mungkin ...

  1. Indeks terlalu besar bahkan untuk tablespace yang baru meningkat. Seberapa besar tabel dan berapa ukuran gabungan dari kolom yang Anda indeks?
  2. Anda tidak menentukan tablespace saat membuat indeks dan itu tidak menggunakan yang Anda pikirkan, apa pun tablespace default untuk skema Anda.

Jawaban ke 1 adalah menambahkan lebih banyak ruang.

Untuk mengetahui tablespace default Anda:

select * from dba_users where username = 'MY_USER'

Jika ini bukan tablespace indeks Anda, Anda harus menentukannya saat membuat indeks.

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

Ya, jika Anda berada di 9i, itu pasti layak mengumpulkan statistik karena tidak mengumpulkannya secara otomatis ketika perubahan yang cukup telah dibuat ke tabel - itu dalam versi yang lebih baru. Gunakan DBMS_STATS.GATHER_TABLE_STATS() dan hanya lakukan ini setelah membangun kembali tabel.

Sayangnya di Oracle Anda tidak bisa mengurangi ukuran tablespace. Untuk menggunakan opsi ini, Anda harus membuat kembali tablespace, tetapi lebih kecil, dan memindahkan semuanya ke sana.

8
Ben

Anda bisa mendapatkan kembali sebagian ruang di tabel terbesar Anda dengan:

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

Perhatikan bahwa Anda mungkin harus membangun kembali beberapa objek setelah itu.

2
Benoit