Mengapa status "DbccFilesCompact" adalah "Ditangguhkan"?


11

Saya menjalankan file SHRINK pada file data 600G.

Saat ini, status dilaporkan sebagai "ditangguhkan" dan sys.dm_exec_requests.percent_completeuntuk DbccFilesCompactperintah melaporkan bahwa itu sedang berjalan (tetapi sangat lambat)

Apakah ada cara untuk memeriksa mengapa itu ditangguhkan dan bagaimana membuatnya lebih lancar?


FYI - SQL Query untuk Memeriksa Status

select T.text, R.Status, R.Command, DatabaseName = db_name(R.database_id)
       , R.cpu_time, R.total_elapsed_time, R.percent_complete
from   sys.dm_exec_requests R
       cross apply sys.dm_exec_sql_text(R.sql_handle) T
order by Command

Jawaban:


10

Tidak, Anda tidak dapat memeriksa mengapa ini berjalan lambat, tetapi saya dapat memberi Anda beberapa petunjuk:

1) Dalam SQL 2005, manajemen indeks nonclustered berubah dari Mesin Penyimpanan (tim saya) ke Prosesor Permintaan. Ini memiliki banyak efek samping, salah satunya adalah kecepatan tumpukan data yang dapat dipindahkan dengan menyusut. Semua catatan indeks yang tidak tercakup mengandung tautan balik ke catatan data yang mereka indeks - dalam kasus tumpukan, ini adalah tautan fisik ke nomor catatan pada halaman data tertentu. Ketika halaman tumpukan data dipindahkan oleh psikiater, semua catatan indeks yang tidak dibatasi yang menghubungkan balik ke catatan pada halaman itu harus diperbarui dengan lokasi baru dari halaman tersebut. Pada tahun 2000 ini dilakukan dengan sangat efisien oleh Storage Engine itu sendiri. Pada tahun 2005 dan seterusnya, ini harus dilakukan dengan memanggil Prosesor Kueri untuk memperbarui catatan indeks yang tidak tercakup. Ini terkadang hingga 100 kali lebih lambat dari tahun 2000.

2) Nilai LOB Off-row (baik tipe data LOB aktual atau data overflow baris) tidak mengandung backlink ke data atau catatan indeks yang menjadi bagiannya. Ketika halaman catatan LOB dipindahkan, seluruh tabel atau indeks yang menjadi bagiannya harus dipindai untuk mencari tahu data / indeks catatan mana yang menunjuk ke mereka, sehingga dapat diperbarui dengan lokasi baru. Ini juga sangat, sangat lambat.

3) Mungkin ada proses lain menggunakan database yang menyebabkan menyusutnya blok menunggu kunci yang diperlukan untuk memindahkan halaman.

4) Anda mungkin memiliki isolasi snapshot diaktifkan, dan psikiater tidak dapat memindahkan halaman dengan tautan store versi sampai transaksi yang membutuhkan versi lama selesai.

5) Subsistem I / O Anda mungkin kurang bertenaga. Panjang antrian disk yang lebih tinggi dari satu digit tunggal berarti subsistem I / O Anda dalam kemacetan.

Salah satu atau semua ini dapat berkontribusi untuk memperlambat waktu menyusut.

Secara umum, Anda tidak ingin menjalankan shrink. Lihat posting blog ini untuk detailnya: Mengapa Anda tidak harus mengecilkan file data Anda .

Semoga ini membantu!


1
@ Paul Randal: Saya menghargai komentar Anda dan tautan ke mengapa psikiater tidak boleh dijalankan kecuali diperlukan. Saya akan mencoba rekomendasi (memindahkan file ke grup file yang berbeda) dan melihat bagaimana hasilnya.
dance2die

8

Anda dapat menjalankan skrip ini untuk memeriksa persentase yang sudah selesai!

SELECT 
    percent_complete, 
    start_time, 
    status, 
    command, 
    estimated_completion_time, 
    cpu_time, 
    total_elapsed_time
    --,*
FROM 
    sys.dm_exec_requests
WHERE
    command = 'DbccFilesCompact'

2

Saya menyusut database dalam SQL Server 2008 SP1 dan satu cara saya dapat memberitahu kemajuan dari perintah Shrink adalah dengan mengeksekusi sp_lock spid dan sebagian besar saya dapat melihat bahwa itu meletakkan kunci pada file 1 kemudian ketika dilakukan menempatkan sebuah file kunci pada id file 2, dan seterusnya dan dengan cara ini saya bisa tahu kapan ia bekerja pada id file terakhir dan ini adalah indikasi saya yang hampir selesai.

Terima kasih,

Alex Aguilar


Seberapa besar Db Anda?
John Zabroski

0

Saya menemukan apa masalahnya (dalam kasus saya) dan saya menawarkan di sini solusi yang saya gunakan.

Saya tidak menggunakan database, dan master adalah database default pada sesi saya, saya telah memverifikasi bahwa menggunakan sp_who2. Lalu saya klik kanan pada database, pilih "tugas" dan kemudian "menyusut" dan pada "ok" dialog. Mengganti lagi dengan sp_who2, status "ditangguhkan" oleh beberapa menit dan setelah itu dibatalkan karena "tidak ada kunci eksklusif dapat diperoleh". Tebak dirimu, tapi aku yakin dialog itu sendirilah yang menyebabkan itu.

Jadi saya memutuskan untuk pergi melalui command line menggunakan:

DBCC SHRINKDATABASE (myDataBase)

(Penyihir di mana-mana didokumentasikan), Kemudian psikiater hanya butuh beberapa detik.


1
DBCC SHRINKDATABASEharus dihindari karena akan mengecilkan semua file untuk basis data - file data apa pun dan file log apa pun.
Zac Faragher

Sepakat. Kami hanya menggunakannya di lingkungan dev. Berguna untuk menghemat ruang disk di AWS tempat disk diukur.
John Zabroski
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.