Saya telah membuat skrip yang, satu per satu, menghapus semua kunci asing dari database, seperti ini:
ALTER TABLE MyTable1 DROP CONSTRAINT FK_MyTable1_col1
ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col1
ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col2
Yang mengejutkan saya adalah skripnya membutuhkan waktu lama: rata-rata, 20 detik untuk setiap DROP FK. Sekarang, saya mengerti bahwa membuat FK mungkin merupakan masalah besar, karena server harus pergi dan memeriksa bahwa batasan FK tidak dilanggar sejak awal, tetapi menurun? Apa yang dilakukan server ketika menjatuhkan FK yang membutuhkan waktu begitu lama? Ini baik untuk keingintahuan saya sendiri, dan untuk memahami jika ada cara untuk membuat segalanya lebih cepat. Mampu menghapus FK (tidak hanya menonaktifkannya) akan memungkinkan saya menjadi lebih cepat selama migrasi, dan karenanya meminimalkan waktu henti.
sql-server
foreign-key
sql-server-2016
carlo.borreo
sumber
sumber
Jawaban:
Menjatuhkan kendala membutuhkan kunci Sch-M (Modifikasi Skema) yang akan memblokir orang lain untuk meminta tabel selama modifikasi. Anda mungkin menunggu untuk mendapatkan kunci itu dan harus menunggu sampai semua pertanyaan yang berjalan saat ini terhadap tabel itu selesai.
Kueri yang berjalan memiliki kunci Sch-S (Stabilitas Skema) di atas meja dan kunci itu tidak kompatibel dengan kunci Sch-M.
Dari Mode Kunci, Skema Kunci
sumber
Sch-S
kunci, dan saya curiga ini adalah penyebab utama masalah OP.Saya akan memandu Anda melalui contoh, jadi, Anda dapat melihat mengapa itu membutuhkan waktu lama. Membuat database kosong untuk pengujian ini.
Membuat 2 tabel.
Membuat batasan Kunci Asing di tabel Orang.
Masukkan beberapa data ke dalam kedua tabel.
Buka jendela permintaan baru dan jalankan ini (jangan tutup jendela setelah permintaan selesai).
Buka jendela permintaan lain dan jalankan ini.
Anda akan melihat Anda menjatuhkan batasan akan terus berjalan (menunggu) dan sekarang jalankan kueri untuk melihat mengapa itu berjalan lebih lama dan kunci apa yang ditunggu.
Setelah Anda melakukan operasi penyisipan Anda, batasan drop akan selesai segera karena sekarang pernyataan drop dapat memperoleh kunci yang diperlukan.
Untuk kasus Anda, Anda perlu memastikan tidak ada sesi memegang kunci yang kompatibel yang akan mencegah drop drop untuk mendapatkan kunci / kunci yang diperlukan.
sumber