Indeks Pembangunan Kembali, ukuran DB sekarang 10x

13

Saya memiliki database SQL Server (2008 R2 SP1) yang sekitar 15 gigs. Ternyata pemeliharaan tidak berjalan dalam beberapa saat, jadi saya membuat rencana pemeliharaan untuk membangun kembali semua indeks, mereka sangat terfragmentasi.

Pekerjaan selesai dan fragmentasi hilang, tetapi sekarang database lebih dari 120 pertunjukan! Saya mengerti bahwa itu akan menggunakan ruang ekstra untuk melakukan semua pembangunan kembali, tetapi sekarang setelah pekerjaan selesai, saya akan berpikir semua ruang itu akan menjadi ruang bebas, tetapi ruang bebas hanya menunjukkan sebagai 3 gigs, jadi 117 gigs sedang digunakan meskipun pekerjaan membangun kembali indeks selesai.

Saya sangat bingung dan dapat menggunakan beberapa panduan, saya mendapatkan db kembali ke ukuran yang masuk akal, kami tidak memiliki ruang disk untuk ini.

Terima kasih sebelumnya!

Inilah hasil dari kedua pertanyaan yang diposting:

log_reuse_wait_desc TIDAK ADA

name    TotalSpaceInMB  UsedSpaceInMB   FreeSpaceInMB
LIVE_Data   152             123             28
LIVE_Log    18939           89              18849
LIVE_1_Data 114977          111289          3688

File ke-3 adalah file .ndf, yang menunjukkan hanya 3688 di ruang yang tidak digunakan, tetapi 111289 di gunakan untuk sekitar 15 gigs data.

AS2012
sumber

Jawaban:

15

Sementara itu aku baru saja memikirkan ini, bersendawa total. Saya telah mengindikasikan apa yang saya pikir sebagai faktor pengisian 90 dalam pekerjaan rekondisi, tetapi dikatakan sebagai "ubah persentase ruang kosong menjadi" jadi dengan menggunakan nilai 90 di sana, saya sebenarnya menggunakan faktor pengisian 10 !! DOH. Tidak heran itu tumbuh 10x lebih besar. Saya akan membangun kembali dengan faktor pengisian yang benar kemudian menyusut. Terima kasih untuk semua orang atas masukannya.

AS2012
sumber
1
Wizard ini mengerikan.
usr
Saya tahu, saya sudah terbiasa dengan perintah di mana Anda menentukan FILL_FACTOR dan tidak gratis%, berharap itu konsisten.
Jangan meng-reindex lalu menyusut, itu hanya buang-buang waktu! Lihat jawaban saya untuk info lebih lanjut.
JNK
1
JNK Saya tahu apa yang Anda maksud dengan tidak menyusut setelah membangun kembali karena itu akan memecah segalanya lagi. Namun, dalam skenario khusus ini di mana Jeff secara tidak sengaja menambahkan 90% ruang kosong ke setiap halaman, saya tidak melihat cara lain untuk merebut kembali ruang itu kemudian ke: membangun kembali dengan fillfactor 90, mengecilkan file, namun Anda harus melakukan pembangunan kembali yang lain dengan fillfactor 90% lagi. Atau akan ada cara lain untuk merebut kembali ruang itu kembali. (Yah, mungkin filegroup baru dan kemudian membangun kembali dengan drop ke filegroup baru tapi itu tidak berhasil untuk semua orang)
Edward Dortland
2

Membangun kembali indeks menyebabkan ruang kendur ekstra dalam DB. Ini adalah produk sampingan alami dari proses pengindeksan ulang - server sedang membangun versi indeks yang baru dan mudah-mudahan berdekatan dengan versi saat ini, kemudian menjatuhkan versi saat ini ketika selesai.

Menyusut setelah pengindeksan ulang tidak ada gunanya!

Anda hanya akan mem-fragment ulang indeks! Shrinking menghapus ruang kendur dengan realokasi data dalam DB.

Inilah artikel bagus dari Paul Randal, yang ketika bekerja di Microsoft bertanggung jawab atas DBCCkode termasuk menyusut, mengapa Anda tidak boleh menyusut.

JNK
sumber
0

Anda seharusnya menggunakan opsi rekondisi SORT_IN_TEMPDB=ON .

Dalam kasus Anda, file data aktual, di mana tabel tersebut berada, telah digunakan untuk mengurutkan indeks. Sebagian besar ruang 120GB masih belum digunakan dan akan diisi dengan data halaman saat dibutuhkan.

Anda dapat melihat status ruang bekas / bebas dengan kueri ini (diambil dari sini ):

use [YourDatabaseNameHere]
go

select
    name,
    cast((size/128.0) as int) as TotalSpaceInMB,
    cast((cast(fileproperty(name, 'SpaceUsed') as int)/128.0) as int) as UsedSpaceInMB,
    cast((size/128.0 - cast(fileproperty(name, 'SpaceUsed') AS int)/128.0) as int) as FreeSpaceInMB
from
    sys.database_files

Untuk menyusutkan file database tertentu (data atau log), Anda dapat melihat beberapa info di sini . Peringatan sebelumnya, melepaskan ruang yang tidak terpakai cukup lama untuk 100+ basis data Gb (tergantung juga pada kecepatan penyimpanan), jadi biarkan saja.

Marcel N.
sumber
Ya format itu tidak, saya akan menambahkannya ke pertanyaan, satu saat.
@JeffBane: Bisakah Anda menambahkan info ini ke pertanyaan Anda, dalam kutipan? Saya tidak bisa melihat apa yang ada di sana.
Marcel N.
1
Saat membangun kembali indeks, Anda akan membutuhkan dua kali ruang indeks + 20% untuk penyortiran. Jadi secara umum untuk membangun kembali setiap indeks di db, Anda hanya perlu 120% dari indeks terbesar di DB. Jika Anda menggunakan SORT_IN_TEMPDB, Anda hanya menang 20%, Anda masih membutuhkan tambahan 100% dalam file data Anda. Lebih jauh lagi, menggunakan sort in tempdb meningkatkan beban IO Anda secara drastis, karena alih-alih menulis indeks satu kali ke filefile, Anda sekarang menulisnya satu kali ke tempdb dan kemudian menulisnya ke file data. Jadi itu tidak selalu ideal.
Edward Dortland
-1

Tanpa detail lain, saya curiga Anda perlu melakukan backup log transaksi sebelum Anda dapat mengklaim kembali ruangnya.

Lihat apa yang select name, log_reuse_wait_desc from sys.databasesmemberitahu Anda. Jika kolom log_reuse_wait_desc mengatakan LOG_BACKUPmaka itu tidak dapat merebut kembali ruang sampai Anda telah membuat cadangan dari tran log.

dpw
sumber
Perlu melakukan pencadangan log transaksi tidak akan pernah menyebabkan halaman tidak dirilis.
mrdenny