Oracle, sebagai database yang sangat besar, banyak digunakan di organisasi besar dengan throughput data yang besar dan jaringan komputer yang luas seperti keuangan, pos dan telekomunikasi, tenaga listrik, dan penerbangan sipil. Bagi administrator sistem, sangat penting untuk memastikan pengoperasian jaringan yang stabil dan meningkatkan kinerja database agar lebih aman dan efisien. Sebagai faktor utama yang mempengaruhi kinerja database, fragmentasi database harus menarik perhatian DBA. Penemuan dan pembersihan fragmen yang tepat waktu adalah konten pemeliharaan dasar DBA.
1. Mengapa terjadi fragmen?
Ketika database dibuat, itu akan dibagi menjadi beberapa segmen logis (Segmen) yang dikenal sebagai tablespace (Tablespace), seperti tablespace sistem (System), tablespace sementara (Temporary), dll. Ruang tabel dapat berisi beberapa rentang data (Extent) dan satu atau lebih blok rentang bebas, yaitu ruang kosong (Ruang Bebas).
Hubungan logis antara ruang tabel, segmen, kategori, dan ruang kosong adalah sebagai berikut:
Ketika sebuah segmen dibuat dalam ruang tabel, ruang akan dialokasikan untuk cakupan awal segmen tersebut dari ruang bebas efektif ruang tabel. Ketika rentang awal ini diisi dengan data, segmen akan meminta penambahan rentang lainnya. Proses perluasan ini akan berlanjut hingga nilai rentang maksimum tercapai, dan mungkin tidak ada ruang kosong di ruang tabel untuk rentang berikutnya. Situasi yang paling ideal adalah data suatu segmen dapat disimpan dalam satu kategori. Dengan cara ini, semua data disimpan dekat dengan data lain dalam segmen tersebut, dan lebih sedikit penunjuk yang diperlukan untuk menemukan data. Namun, ada banyak kasus ketika sebuah segmen berisi beberapa bidang, dan tidak ada cara untuk membuktikan bahwa bidang tersebut disimpan di dekatnya. Ketika kebutuhan ruang harus dipenuhi, database tidak lagi menutup rentang bebas yang berdekatan (kecuali jika tidak ada cara), namun mencari rentang bebas terbesar di ruang tabel untuk digunakan. Hal ini lambat laun akan membentuk ruang bebas yang semakin terpisah, terpisah, dan semakin kecil, yaitu fragmen.
2. Dampak fragmentasi terhadap sistem
Seiring berjalannya waktu, meluasnya penggunaan sistem aplikasi berbasis database akan menghasilkan semakin banyak fragmen, yang akan memberikan dua dampak penting berikut pada database:
1) Terjadi penurunan kinerja sistem
Secara umum, ketika kebutuhan ruang harus dipenuhi, database pertama-tama akan mencari wilayah jelajah bebas terbesar saat ini, dan wilayah jelajah bebas "terbesar" secara bertahap menjadi lebih kecil, dan semakin sulit untuk menemukan wilayah jelajah bebas yang cukup besar sulit, sehingga hambatan kecepatan pada ruang tabel membuat alokasi ruang database semakin jauh dari keadaan ideal;
2) Sebarkan ruang meja dalam jumlah besar
Meskipun beberapa area kosong (seperti penambahan ruang tabel bukan nol) akan digabungkan secara berkala oleh proses bos latar belakang SMON (pemantauan sistem), selalu ada beberapa area kosong yang tidak dapat ditutup secara otomatis, sehingga membuang banyak meja ruang angkasa. .
3. Perhitungan fragmen kategori bebas
Karena fragmentasi ruang bebas terdiri dari beberapa bagian, seperti jumlah kategori, ukuran rentang maksimum, dll., kita dapat menggunakan nilai FSFI--Indeks Fragmentasi Ruang Bebas (Indeks Fragmentasi Ruang Bebas) untuk mencerminkan secara intuitif:
FSFI=100*SQRT(maks(luas)/jumlah(luas))*satu/SQRT(SQRT(hitungan(luas)))
Seperti yang bisa dilihat, nilai maksimum FSFI adalah 100 (ruang meja tunggal yang ideal). Ketika cakupannya bertambah, nilai FSFI menurun secara perlahan, dan seiring dengan berkurangnya ukuran cakupan maksimum, nilai FSFI menurun dengan cepat.
Skrip berikut dapat digunakan untuk menghitung nilai FSFI:
rem Perhitungan Nilai FSFI
rem fsfi.sql
kolom format FSFI 999,99
pilih tablespace_name,sqrt(max(blocks)/sum(blocks))*
(100/sqrt(sqrt(hitungan(blok)))) FSFI
dari dba_free_space
kelompokkan berdasarkan nama_tablespace diurutkan satu per satu;
spul fsfi.rep;
/
tergulung;
Misalnya, saat menjalankan skrip fsfi.sql di database tertentu, nilai FSFI berikut akan hilang:
TABLESPACE_NAME FSFI
------------------------------- -------
RBS 74.06
SISTEM 100.00
SUHU 22.82
ALAT 75.79
PENGGUNA 100,00
USER_TOOLS 100,00
YDCX_DATA 47.34
YDCX_IDX 57.19
YDJF_DATA 33.80
YDJF_IDX 75.55
---- Setelah nilai FSFI database dihitung, nilai tersebut dapat digunakan sebagai parameter pembanding. Pada table space yang mempunyai ruang kosong efektif yang cukup dan nilai FSFI diatas 30, permasalahan ruang kosong efektif jarang ditemui. Jika suatu ruang mendekati parameter yang sebanding, ruang tersebut perlu didefragmentasi.
4. Memilah bagian-bagian dari kategori gratis
Nilai pctincrease dari ruang tabel bukan nol
Anda dapat mengubah parameter penyimpanan default pctincrease ruang tabel menjadi bukan nol. Biasanya setel ke satu, seperti:
mengubah suhu tablespace
penyimpanan default (pcmeningkat 1);
Dengan cara ini SMON secara otomatis akan mengelompokkan kategori gratis. Anda juga dapat mengelompokkan kategori gratis secara manual:
mengubah suhu tablespace menyatu;
5. Mengambil bagian-bagian paragraf
Kita tahu bahwa segmen terdiri dari kategori. Dalam beberapa kasus, perlu untuk membersihkan fragmen segmen tersebut. Untuk melihat informasi terkait segmen, lihat kamus data dba_segments, dan untuk informasi kategori, lihat kamus data dba_extents.
Segmen data kueri
pilih segment_name,tablespace_name,bytes,blocks dari USER_EXTENTS;
Segmen direktori kueri
pilih nama_indeks,pemilik_tabel,nama_tabel,nama_ruang tabel dari USER_EXTENTS;
Lihat informasi segmen melalui dba_segments
pilih tablespacee_name,count(*) noobjects,round(sum(bytes)/1024/1204/1024.2) GB,sum(blocks),sum(extents) dari
grup dba_segments berdasarkan rollup(tablespace_name);
Jika suatu segmen terlalu terfragmentasi, cara termudah untuk mengompresi datanya ke dalam suatu rentang adalah dengan membangun kembali segmen tersebut dengan parameter penyimpanan yang benar, lalu memasukkan data dari tabel lama ke dalam tabel baru, dan pada saat yang sama menghapus tabel lama. . Proses ini dapat dilakukan dengan menggunakan alat Impor/Ekspor (input/output).
Perintah Ekspor () memiliki tanda (terkompresi), yang ketika membaca tabel akan menyebabkan Ekspor menentukan jumlah ruang fisik yang dialokasikan ke tabel, dan akan menulis parameter penyimpanan inisialisasi baru ke data dump keluaran-yaitu, semua Alokasikan ruang. Jika tabel ini ditutup, gunakan alat Impor () untuk membuatnya kembali. Dengan cara ini, datanya akan ditempatkan ke dalam segmen awal baru yang lebih besar. Misalnya:
file pengguna/kata sandi exp=exp.dmp kompres=Y hibah=Y indeks=Y
tabel=(tabel satu, tabel dua);
Jika keluaran berjalan lancar, hapus tabel yang diekspor dari pustaka, lalu impor tabel dari data dump keluaran:
file pengguna/kata sandi imp=exp.dmp commit=Y buffer=64000 penuh=Y