Digunakan untuk (dan berpotensi dimanjakan oleh) MSSQL, saya bertanya-tanya bagaimana saya bisa mendapatkan ukuran tabel di Oracle 10g. Saya telah mencarinya di Google jadi saya sekarang sadar bahwa saya mungkin tidak memiliki pilihan semudah sp_spaceused. Tetap saja jawaban potensial yang saya dapatkan sebagian besar sudah usang atau tidak berfungsi. Mungkin karena saya bukan DBA di skema saya bekerja dengan.
Adakah yang punya solusi dan atau rekomendasi?
Jawaban:
Anda mungkin tertarik dengan pertanyaan ini. Ini memberi tahu Anda berapa banyak ruang yang dialokasikan untuk setiap tabel dengan mempertimbangkan indeks dan setiap LOB di atas meja. Seringkali Anda tertarik untuk mengetahui "Berapa banyak ruang yang dibutuhkan tabel Purchase Order, termasuk indeks apa pun" daripada hanya tabel itu sendiri. Anda selalu dapat mempelajari detailnya. Perhatikan bahwa ini membutuhkan akses ke tampilan DBA_ *.
sumber
sumber
null
(num_rows
,avg_row_len
), Anda perlu membuat beberapa analisis sebelum melalui pernyataan berikutANALYZE TABLE your_table COMPUTE STATISTICS
Pertama, saya biasanya memperingatkan bahwa mengumpulkan statistik tabel untuk melakukan analisis ruang adalah hal yang berpotensi berbahaya untuk dilakukan. Mengumpulkan statistik dapat mengubah rencana kueri, terutama jika DBA telah mengonfigurasi pekerjaan pengumpulan statistik yang menggunakan parameter non-default yang tidak digunakan panggilan Anda, dan akan menyebabkan Oracle mem-parsing ulang kueri yang menggunakan tabel yang dipermasalahkan yang dapat menjadi kinerja memukul. Jika DBA sengaja meninggalkan beberapa tabel tanpa statistik (umum jika Anda
OPTIMIZER_MODE
PILIH), mengumpulkan statistik dapat menyebabkan Oracle berhenti menggunakan pengoptimal berbasis aturan dan mulai menggunakan pengoptimal berbasis biaya untuk serangkaian pertanyaan yang dapat menjadi kinerja utama sakit kepala jika dilakukan secara tak terduga dalam produksi. Jika statistik Anda akurat, Anda dapat memintaUSER_TABLES
(atauALL_TABLES
atauDBA_TABLES
) langsung tanpa meneleponGATHER_TABLE_STATS
. Jika statistik Anda tidak akurat, mungkin ada alasan untuk itu dan Anda tidak ingin mengganggu status quo.Kedua, setara terdekat dengan
sp_spaceused
prosedur SQL Server kemungkinanDBMS_SPACE
paket Oracle . Tom Kyte memilikishow_space
prosedur bagus yang menyediakan antarmuka sederhana untuk paket ini dan mencetak informasi yang mirip dengan apa yangsp_spaceused
dicetak.sumber
Pertama, kumpulkan statistik pengoptimal di atas meja (jika belum):
PERINGATAN: Seperti yang dikatakan Justin dalam jawabannya, mengumpulkan statistik pengoptimal memengaruhi pengoptimalan kueri dan tidak boleh dilakukan tanpa perhatian dan pertimbangan !
Kemudian temukan jumlah blok yang ditempati oleh tabel dari statistik yang dihasilkan:
Jumlah total blok yang dialokasikan ke tabel adalah blok + empty_blocks + num_freelist_blocks.
blok adalah jumlah blok yang sebenarnya mengandung data.
Lipat gandakan jumlah blok dengan ukuran blok yang digunakan (biasanya 8KB) untuk mendapatkan ruang yang dikonsumsi - misalnya 17 blok x 8KB = 136KB.
Untuk melakukan ini untuk semua tabel dalam skema sekaligus:
Catatan: Perubahan yang dibuat di atas setelah membaca utas AskTom ini
sumber
Saya memodifikasi kueri WW untuk memberikan informasi lebih rinci:
sumber
Untuk tabel dan indeks sub-partisi kami dapat menggunakan kueri berikut
sumber
IIRC tabel yang Anda butuhkan adalah DBA_TABLES, DBA_EXTENTS atau DBA_SEGMENTS dan DBA_DATA_FILES. Ada juga versi USER_ dan ALL_ untuk tabel ini yang bisa Anda lihat jika Anda tidak memiliki izin administrasi di mesin.
sumber
Inilah varian jawaban WWs, ini mencakup partisi dan sub-partisi seperti yang disarankan orang lain di atas, ditambah kolom untuk menunjukkan JENIS: Tabel / Indeks / LOB dll.
sumber
sumber
Saya memodifikasi kueri untuk mendapatkan ukuran skema per tablespace ..
sumber
Tergantung apa yang Anda maksud dengan "ukuran tabel". Tabel tidak berhubungan dengan file tertentu pada sistem file. Sebuah tabel akan berada di tablespace (mungkin beberapa tablespace jika dipartisi, dan mungkin beberapa tablespace jika Anda juga ingin memperhitungkan indeks akun pada tabel). Tablespace sering memiliki beberapa tabel di dalamnya, dan dapat tersebar di beberapa file.
Jika Anda memperkirakan berapa banyak ruang yang Anda perlukan untuk pertumbuhan tabel di masa mendatang, maka avg_row_len dikalikan dengan jumlah baris dalam tabel (atau jumlah baris yang Anda harapkan dalam tabel) akan menjadi panduan yang baik. Tetapi Oracle akan membiarkan beberapa ruang kosong di setiap blok, sebagian untuk memungkinkan baris 'tumbuh' jika diperbarui, sebagian karena tidak mungkin untuk memasukkan seluruh baris lain pada blok itu (misalnya blok 8K hanya akan cocok dengan 2 baris 3K, meskipun itu akan menjadi contoh ekstrim karena 3K jauh lebih besar daripada ukuran baris paling). Jadi BLOCKS (dalam USER_TABLES) mungkin menjadi panduan yang lebih baik.
Tetapi jika Anda memiliki 200.000 baris dalam sebuah tabel, menghapus setengahnya, maka tabel tersebut masih 'memiliki' jumlah blok yang sama. Itu tidak melepaskan mereka untuk tabel lain untuk digunakan. Juga, blok tidak ditambahkan ke tabel secara individual, tetapi dalam kelompok yang disebut 'luas'. Jadi pada umumnya akan ada EMPTY_BLOCKS (juga di USER_TABLES) dalam sebuah tabel.
sumber
Koreksi untuk tabel yang dipartisi:
sumber
Pilih sederhana yang mengembalikan ukuran mentah tabel, berdasarkan ukuran blok, juga termasuk ukuran dengan indeks
pilih table_name, (nvl ((pilih jumlah (blok) dari dba_indexes a, dba_segments b di mana a.index_name = b.segment_name dan a.table_name = dba_tables.table_name), 0) + blok) * 8192/1024 TotalSize, blok * 8 tableSize dari dba_tables dipesan oleh 3
sumber
Saya menemukan ini sedikit lebih akurat:
sumber
sumber
ada satu opsi lagi yang memungkinkan untuk mendapatkan ukuran "pilih" dengan gabungan, dan ukuran tabel sebagai opsi juga
sumber
Saya memiliki varian yang sama dengan yang terakhir yang menghitung segmen data tabel, indeks tabel, dan blob-bidang:
Sumber .
sumber