Saya memelihara database SQL Server 2005 yang menampung sekitar 2,9Tb data (2 x 1,45Tb - Saya memiliki skema RAW dan skema ANALISIS jadi pada dasarnya dua salinan data dicerna). Model pemulihan SEDERHANA dan .ldf
pada 6Gb.
Untuk alasan apa pun, .mdf
ini adalah 7.5Tb. Sekarang, mungkin hanya ada 2-3 kolom tambahan dalam tabel ANALISA dan tidak banyak NVARCHAR(MAX)
kolom yang, dari apa yang saya (mungkin salah paham - perbaiki saya jika saya salah) dapat menyebabkan alokasi ruang tambahan. Itu setelah menyusutkan database sekarang - itu pada ~ 9TB sebelum itu. Adakah pikiran?
Dan, tolong, beri tahu saya jika Anda memiliki pertanyaan tambahan - Saya sangat baru dalam hal administrasi basis data dan upaya pengoptimalan (Saya biasanya tidak melakukan pekerjaan sampingan ini :)).
Terimakasih banyak!
Andrija
sumber
Jawaban:
Dalam perkiraan ukuran Anda, sudahkah Anda memperhitungkan jumlah ruang yang diambil oleh indeks? Juga jika Anda memiliki bidang teks yang ditetapkan sebagai multi-byte (
N[VAR]CHAR
bukan[VAR]CHAR
) dan file input UTF-8 atau polos satu-byte-per-karakter maka itu akan mendorong persyaratan penyimpanan Anda hingga faktor dua. Lebih jauh lagi ingat bahwa jika Anda memiliki kunci / indeks berkerumun di tabel ukuran ini mempengaruhi semua indeks lain di atas meja karena mereka menyertakan nilai kunci berkerumun untuk setiap baris (jadi untuk memberikan contoh ekstrem jika tabel memiliki NCHAR (10 ) kunci di mana INT akan dilakukan dan itu adalah kunci / indeks berkerumun Anda, Anda tidak hanya menggunakan tambahan 16 byte per baris di halaman data, Anda juga membuang 16 byte per baris di setiap indeks lain pada tabel itu ) .Juga, beberapa ruang akan dialokasikan tetapi tidak digunakan, baik karena mesin DB telah meninggalkan beberapa ruang yang dialokasikan setelah dihapus sehingga dapat digunakan kembali dengan cepat untuk data baru dalam tabel itu atau karena pola memasukkan dan menghapus telah meninggalkan banyak halaman hanya bagian penuh.
Anda dapat menjalankan:
untuk melihat sekilas tabel apa yang mengambil ruang.
Juga
EXEC sp_spaceused
berjalan di dalam DB yang akan mengembalikan dua set hasil. Yang pertama daftar total ruang yang dialokasikan dalam sistem file untuk file data dan berapa banyak yang tidak dialokasikan, yang kedua daftar berapa banyak ruang yang dialokasikan digunakan untuk halaman data, untuk halaman indeks, atau saat ini tidak digunakan.sp_spaceused
akan mengembalikan ruang yang digunakan oleh objek yang diberikan juga, sehingga Anda dapat mengulang ini untuk membangun tabel untuk analisis:Kode di atas akan menampilkan semua ukuran tabel dalam satu daftar, ditambah satu baris untuk total. Jika perlu Anda dapat menggunakan berbagai tampilan sistem (seperti
sys.objects
dansys.dm_db_partition_stats
digunakan dalam permintaan pertama di atas, lihat http://technet.microsoft.com/en-us/library/ms177862.aspx untuk lebih jelasnya) untuk mendapatkan detail lebih lanjut seperti ruang yang digunakan oleh setiap indeks.Ada tiga kelas ruang yang tidak digunakan dalam file data:
sp_spaceused
tanpa objek yang ditentukan)sp_spaceused
output.Peringatan lain di sini adalah benda besar (
TEXT
kolom,[N]VARCHAR(MAX)
nilai-nilai di atas ukuran tertentu dan seterusnya) karena mereka ditempatkan di luar halaman, hanya mengambil 8 byte di data baris utama untuk menahan pointer ke data di tempat lain) sehingga dapat mematahkan 8.192 byte-per-baris-batas.tl; dr: Memperkirakan ukuran basis data yang diharapkan bisa menjadi jauh lebih banyak terlibat daripada yang biasanya diasumsikan pada awalnya.
sumber
Coba jalankan
sp_spaceused
di database Anda. Sebagai contoh ia mengembalikan:Untuk menjalankannya pada database, hanya
USE
database kemudian jalankansp_spaceused
.Jika masih menunjukkan banyak ruang yang tidak digunakan, Anda dapat mencoba menyusut lagi. Terkadang saya merasa perlu beberapa kali percobaan. Juga kadang-kadang saya menemukan itu bekerja lebih baik untuk mengecilkan file individual daripada database secara keseluruhan. Namun apa yang Anda temukan adalah bahwa Anda memiliki data 2,9TB dan indeks 4 + Tb lainnya dalam hal 7.5TB cukup masuk akal. Jika Anda ingin merasakan jumlah ruang (data & indeks) dari masing-masing tabel maka Anda dapat berjalan
sp_spaceused
di level tabel juga. Anda bisa menjalankannya di semua tabel dalam database dengan menggunakan perintah berikut:Meskipun sp_msforeachtable peringatan yang adil tidak berdokumen, tidak didukung, dan telah diketahui kehilangan tabel. Di sisi lain, saya sendiri cukup beruntung.
Semua itu dikatakan database Anda HARUS memiliki persentase ruang bebas tertentu tergantung pada pertumbuhan yang Anda harapkan. Pada dasarnya Anda ingin memastikan bahwa Anda memiliki ruang untuk pertumbuhan mulai dari 6 bulan hingga beberapa tahun. Anda juga akan ingin memeriksa
autogrowth
pengaturan Anda untuk memastikan mereka sesuai dengan situasi Anda. Khususnya mengingat ukuran basis data Anda, Anda TIDAK ingin menggunakan%autogrowth
.sumber
Menggunakan SQL Management Studio, 1. Klik kanan pada Database Kemudian 2. Klik Tugas-> Kecilkan -> File
Anda akan melihat dialog yang menunjukkan: a. Ruang yang Saat Ini Dialokasi b. Tersedia Ruang Kosong + (% gratis)
Jika% Gratis Anda lebih dari 50%, Anda mungkin mempertimbangkan untuk menyusutkan file. Saya telah melihat hit ini sebanyak 90%. Jika saya memutuskan untuk mengecilkan file saya biasanya mengaturnya ke 2 atau 3 gigs lebih dari ruang yang dialokasikan saat ini. Sebagian besar database saya kurang dari 50 pertunjukan. Jadi jika Anda memiliki file yang jauh lebih besar maka Anda mungkin membuatnya 10 gigs. Saya biasanya hanya khawatir tentang menyusut jika saya akan memindahkan database ke server lain, Anda dapat membaca semua tentang masalah menyusut pada halaman sql apa pun.
sumber