Mengapa tidak HAPUS + REORG ruang disk bebas (DB2)?

18

Dalam DB2 saya punya tabel yang berisi data biner besar. Sekarang saya membersihkan seluruh tabel dan menjalankan runstats, reorg, runstats, tetapi jumlah ruang disk yang diambil tidak berubah. Apa yang salah di sini?

Tabel berada di tablespace sendiri yang saya buat sebagai berikut:

CREATE BUFFERPOOL "MY_BP" SIZE 250 AUTOMATIC PAGESIZE 4096;
CREATE LARGE TABLESPACE MY_TBS IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 64 PREFETCHSIZE 64 BUFFERPOOL MY_BP OVERHEAD 10.500000 TRANSFERRATE 0.140000 FILE SYSTEM CACHING;

Saya menghapus / me-reorg sebagai berikut:

DELETE FROM MY_TBL
RUNSTATS ON TABLE MY_TBL WITH DISTRIBUTION AND DETAILED INDEXES ALL
REORG TABLE MY_TBL
RUNSTATS ON TABLE MY_TABLE WITH DISTRIBUTION AND DETAILED INDEXES ALL
ALTER TABLESPACE MY_TBS REDUCE

Tabel MY_TBL mengambil 2,5GB sebelum semua itu dan setelah menghapus / reorging menggunakan hanya 3 MB lebih sedikit.

FWIW: Saya menjalankan DB2 / NT v9.5.2.

Alexander Tobias Bockstaller
sumber
Apakah ini berfungsi untuk sistem pada db2 v8?
Tony

Jawaban:

22

Saya akan menebak bahwa Anda menggunakan penyimpanan otomatis. (Bukan berarti ini bisa terjadi sebaliknya ... hanya saja mudah terjadi dengan penyimpanan otomatis.)

Masalahnya adalah kemungkinan besar bahwa database Anda mengambil kembali ruang untuk dirinya sendiri tetapi tidak melepaskan disk kembali ke sistem operasi. Ini dapat ditampilkan dengan sangat mudah dengan memeriksa Tanda Air Tinggi untuk tablespace.

Lakukan yang berikut ini

db2 list tablespaces show detail

Ini akan menunjukkan kepada Anda setiap tablespace dan apa yang digunakan pada disk. Used pagesadalah berapa banyak halaman disk yang digunakan database. Membandingkannya dengan total pages(total diklaim pada disk) dan High water mark (pages)akan menunjukkan kepada Anda jika Anda "mengklaim" lebih dari yang sebenarnya Anda butuhkan. (yaitu, halaman yang digunakan rendah, halaman total sangat tinggi dan Tanda Air Tinggi dekat dengan halaman total).

Untuk menyingkirkan ruang yang tidak terpakai ini dan mengembalikannya ke sistem operasi Anda akan mengeluarkan berikut (di bawah penyimpanan otomatis): db2 alter tablespace <tablespace name> reduce max. contoh

db2 alter tablespace ts1 reduce max;

Itu akan menyebabkan DB2 menurunkan tanda air tinggi dan melepaskan disk yang tidak digunakan kembali ke sistem operasi. (Catatan Anda hanya bisa melakukan ini untuk tablespace reguler dan tablespace besar, bukan untuk sistem sementara, atau tablespace sementara pengguna).

Jika Anda menggunakan DMS tanpa penyimpanan otomatis, Anda perlu menggunakan serangkaian perintah yang sedikit berbeda:

db2 alter tablespace <tablespace name> lower high water mark;
db2 alter tablespace reduce (<containter name> or [all containers] integer K|M|G or integer PERCENT);

contoh

db2 alter tablespace ts1 lower high water mark;
db2 alter tablespace reduce (all containers 500 M);

Di tempat kami bekerja, kami menempatkan ini ke dalam beberapa skrip pemeliharaan kami sehingga kami menjalankan ini secara otomatis setelah kami melakukan reorg untuk memastikan kami mendapatkan kembali ruang disk. Dalam kasus kami, kami menggunakan DB2 LUW 9.7 FP 4, jadi tidak ada salahnya untuk memeriksa kembali Pusat Informasi untuk 9.5 untuk memastikan Anda memiliki akses ke informasi yang tepat untuk versi Anda.

EDIT: Jika tablespace Anda berasal dari database yang ditingkatkan ke DB2 9.7, Anda mungkin tidak akan memiliki set atribut penyimpanan yang dapat direklamasi. Ini benar bahkan jika Anda meningkatkan dari DMS ke penyimpanan otomatis. Either way menggigit karena Anda tidak dapat benar-benar menurunkan tanda air tinggi. Anda harus membuang tabel dan data keluar, jatuhkan tablespace. Kemudian buat kembali tablespace menggunakan penyimpanan otomatis dan impor data untuk tabel Anda.

Chris Aldrich
sumber
+1 - bagus untuk melihat pakar DB2 berkontribusi ke situs. Kami sudah lemah di domain itu di masa lalu.
Philᵀᴹ
1
Hanya komentar singkat, di DB2 9.5, Anda tidak dapat menggunakan alter tablespace <tbsp> lower high watermarkatau alter tablespace <tbsp> reduce maxsintaksis - ini tidak diperkenalkan sampai DB2 9.7.
Ian Bjorhovde
Seperti yang saya sebutkan di posting awal saya, saya sudah mencoba sebagian besar dan itu tidak berhasil. Sekarang saya menemukan solusinya: Ruang disk tidak dapat direklamasi karena saya tidak menentukan opsi LONGLOBDATA, yang sepertinya diperlukan jika Anda ingin mendapatkan kembali ruang disk dari BLOB atau CLOB. Silakan lihat jawaban saya untuk pertanyaan saya sendiri di sini. Pokoknya saya menghargai upaya yang Anda berikan dalam jawaban Anda, +1!
Alexander Tobias Bockstaller
9

Tabel ini MY_TBLberisi data biner besar dalam sebuah BLOBkolom. Dokumentasi REORGperintah mengatakan bahwa DB2 menghindari menata ulang objek seperti itu karena memakan waktu dan tidak meningkatkan pengelompokan. Namun, DB2 dapat dipaksa untuk mengatur ulang data LOB jika LONGLOBDATAopsi tersebut ditentukan. Ruang yang tidak digunakan dapat digunakan kembali oleh DB2, jadi menyisipkan data baru akan terlebih dahulu mengisi halaman yang ada dan tidak terpakai sebelum mengalokasikan yang baru.

Lari

REORG TABLE MY_TBL LONGLOBDATA

berhasil mereklamasi 2.5GB ruang disk yang digunakan tabel kosong.

Saya tidak tahu tentang opsi ini dan melihatnya pertama kali saya membaca dokumentasi.

Alexander Tobias Bockstaller
sumber
Poin bagus. Namun, dari apa yang baru saya pelajari pada episode DB2NightShow "Attack of the Blob" Anda tidak ingin menjalankan opsi LONGLOBDATA terlalu sering karena membutuhkan waktu lebih lama dan / atau menyebabkan masalah kinerja (jika Anda mencoba melakukan REORGs online) .
Chris Aldrich
Basis data yang kami tangani berisi data log dari mesin industri. Pertanyaan terhadap basis data semacam itu tidak kritis terhadap waktu, jadi jika kinerja turun saat reorg, ini bukan masalah.
Alexander Tobias Bockstaller