Saya punya beberapa tabel dengan jumlah baris antara 5M dan 1.5G
Setiap tabel memiliki bidang BLOB, yang ukurannya bervariasi dari 100 byte hingga 30 MB dan yang disimpan sebagai 'tipe nilai besar di luar baris' = ON
Tabel disimpan dalam grup-grup file berbeda dengan 3-4 file masing-masing pada disk yang berbeda @ LUN yang berbeda @ SAN yang sangat cepat
Setiap hari tabel ini tumbuh dengan ukuran 5-100 Gb dan dengan 600k - 1,5M baris
Setelah waktu tertentu , yang bervariasi dari 2 minggu hingga 6 bulan, beberapa baris dihapus atau dipindahkan ke arsip DB, jadi - tidak ada baris di meja kerja yang lebih dari 6 bulan.
Konfigurasi server saat ini:
- Mesin server SQL adalah 2008 R2 SP1 Enterprise @ 24 core, @ 64Gb RAM
- SQL Server berjalan dengan bendera startup tambahan:
-T 3640; (Menghilangkan pengiriman pesan DONE_IN_PROC ke klien untuk setiap pernyataan dalam prosedur tersimpan. Ini mirip dengan pengaturan sesi SET NOCOUNT ON, tetapi ketika ditetapkan sebagai tanda jejak, setiap sesi klien ditangani dengan cara ini)
-T 1118; (Mengalihkan alokasi dalam tempDB dari 1pg pada satu waktu (untuk 8 halaman pertama) ke satu tingkat.)
-T 2301; (Mengaktifkan optimisasi lanjutan yang khusus untuk permintaan dukungan keputusan. Opsi ini berlaku untuk pemrosesan dukungan keputusan dari kumpulan data besar)
-T 1117; (Tumbuhkan semua file data sekaligus, jika tidak bergantian)
-E; (Menambah jumlah luasan yang dialokasikan untuk setiap file dalam filegroup. Opsi ini mungkin berguna untuk aplikasi data warehouse yang memiliki jumlah pengguna terbatas yang menjalankan indeks atau pemindaian data)
-T 834; (Menyebabkan SQL Server menggunakan alokasi halaman besar Windows untuk memori yang dialokasikan untuk buffer pool, http://msdn2.microsoft.com/en-us/library/aa366720.aspx , http://support.microsoft. com / kb / 920093 )
- SQL Server menggunakan ekstensi halaman besar
- SQL Server menggunakan opsi inisialisasi file cepat
- AUTOSHRINK MATI untuk semua basis data
Masalahnya adalah - bahwa mulai dari beberapa titik waktu server (dari beberapa hari hingga berbulan-bulan) GHOST CLEANUP
proses menolak untuk melakukan pembersihan paksa dan hanya melakukan pekerjaan biasa - membersihkan beberapa halaman dalam beberapa detik ( which is seen thru Extended Events
), yang tidak cocok , karena tidak dapat membersihkan semua baris yang dihapus
Masalahnya berlanjut dari masa SQL Server 2005 RTM Enterprise
Bagaimana saya mencoba menyelesaikan masalah:
- Mencoba memaksa operasi SCAN pada indeks tabel yang berkerumun
- Mencoba memaksa operasi SCAN, yang melibatkan semua konten kolom BLOB pada indeks berkerumun tabel
- sistem sp_clean_db_free_space & sp_clean_db_file_free_space
- cleanpage dbcc secara manual (@dbid, @fileid, @page) untuk semua file dan halaman di DB
- indeks cluster dibangun kembali dan direorganisasi
- membuat ulang basis data
FORCEGHOSTCLEANUP DBCC
Ketika saya menjalankan kueri:
select * from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')
Saya melihat jutaan dan puluhan juta catatan hantu, tetapi hanya untuk tipe unit alokasi LOB_DATA
Satu-satunya hal, yang membantu:
- menghentikan server dengan perintah SHUTDOWN atau me-restart seluruh host - ini membantu, setelah memulai kembali proses GHOST CLEANUP berjalan beberapa jam dan benar-benar membersihkan semua catatan hantu
- DBCC SHRINKFILE dengan opsi EMPTYFILE - memindahkan semua data dari satu file ke file lain atau yang baru dibuat membersihkan catatan hantu di file ini saja - masalahnya adalah bahwa saya benar-benar benci operasi menyusut. Dan ini membutuhkan 3-4 hari untuk SATU file
pertanyaannya - apakah ada cara terprogram (lebih disukai) atau pemeliharaan untuk memaksa GHOST CLEANUP tanpa server downtime sama sekali, karena server downtime biayanya terlalu banyak, bahkan tidak dapat diterima - dari ribuan hingga puluhan ribu $ per jam
Masalah yang diperhatikan sama seperti masalah saya ada di sini:
- http://support.microsoft.com/kb/932115
- http://www.sqlservercentral.com/Forums/Topic496244-149-1.aspx
Dan hal yang sama ada di sini:
sumber