Saya tahu bahwa INSERT pada tabel SQL bisa lambat karena sejumlah alasan:
- Keberadaan INSERT TRIGGER ada di atas meja
- Banyak kendala yang dipaksakan yang harus diperiksa (biasanya kunci asing)
- Halaman terpecah dalam indeks berkerumun ketika baris dimasukkan di tengah tabel
- Memperbarui semua indeks non-cluster terkait
- Memblokir dari aktivitas lain di atas meja
- IO yang buruk menulis waktu respons
- ... apa pun yang saya lewatkan?
Bagaimana saya bisa tahu mana yang bertanggung jawab dalam kasus spesifik saya? Bagaimana saya bisa mengukur dampak dari pemisahan halaman vs pembaruan indeks non-cluster vs yang lainnya?
Saya memiliki proc tersimpan yang menyisipkan sekitar 10.000 baris sekaligus (dari tabel temp), yang membutuhkan waktu sekitar 90 detik per 10k baris. Itu sangat lambat, karena menyebabkan spids lain mati.
Saya telah melihat rencana eksekusi, dan saya melihat tugas INSERT CLUSTERED INDEX dan semua INDEKS PENCARIAN dari pencarian FK, tetapi masih tidak memberi tahu saya pasti mengapa itu memakan waktu begitu lama. Tidak ada pemicu, tetapi tabel memang memiliki beberapa FKeys (yang tampaknya diindeks dengan benar).
Ini adalah database SQL 2000.
Jawaban:
Beberapa hal yang dapat Anda lihat ...
Kurangi ukuran batch dari 10.000 menjadi sesuatu yang lebih kecil, seperti 2000 atau 1000 (Anda tidak mengatakan seberapa besar ukuran baris Anda).
Coba nyalakan Statistik IO untuk melihat seberapa banyak IO yang diambil oleh FK.
Apa yang menunggu disebabkan oleh saat penyisipan itu terjadi (master.dbo.sysprocesses)?
Mari kita mulai dari sini dan lihat ke mana kita pergi.
sumber
Brad,
Anda harus memeriksa statistik tunggu untuk permintaan Anda. Dengan SQL2000 Anda bisa menggunakan sintaks DBCC SQLPERF ("waitstats") untuk mendapatkan detail tersebut.
sumber
Saya bisa mengatakan apa yang saya cari ketika menganalisis kinerja kueri. Mungkin itu membantu.
sumber
Coba gunakan:
dan
STATISTIK IO
PROFIL STATISTIK
sumber