INSERT memakan waktu lebih dari 5 jam, ketika memasukkan lebih dari jumlah baris tertentu

8

Ketika memasukkan kurang dari sekitar 1.350.000 baris ke tabel, semuanya membutuhkan waktu sekitar 2 menit, namun ketika jumlah baris yang disisipkan lebih besar, maka waktu yang dibutuhkan untuk memasukkan data tumbuh sekitar 5 jam.

Masalahnya tidak terhubung dengan kueri atau indeks, karena semuanya telah berfungsi dengan baik untuk waktu yang lama dan tidak ada yang berubah dalam struktur kueri, tabel, atau indeks.

Masalah muncul untuk pertama kalinya sekitar 2 minggu yang lalu dan muncul berulang kali pada hari-hari, ketika jumlah baris yang disisipkan lebih besar dari + -1,350,000. Misalnya pada satu hari jumlah baris yang dimasukkan adalah 1.200.000 dan prosesnya memakan waktu 2 menit, di hari lain jumlah baris adalah 1.450.000 dan dibutuhkan 5-6 jam untuk memasukkan data.

Saya mencoba membangun kembali indeks, tetapi tidak membantu.

Piotr
sumber
3
Apa sumber untuk memasukkan?
Martin Smith
4
Bisakah Anda memposting apa yang terkait dengan tunggu saat memasukkan waktu yang lama?
Kin Shah
4
Kami hanya dapat menebak kecuali Anda memberikan informasi lebih lanjut. Dugaan saya adalah eskalasi kunci terjadi. Bisakah Anda melacak menunggu dan mengunci eskalasi
Shanky
1
Apakah ini pertama kalinya Anda mencoba menyisipkan 1,3 juta catatan? Apakah Anda melakukan transaksi? Impor Massal? Apa jenis logging yang Anda lakukan? Jika Anda melakukan insert plain-jane, saya setuju, coba lakukan insert dalam batch.
SQLburn
2
Bagaimana Anda mengimpor data (bcp, masukkan massal, SSIS, file batch)? Dari mana (penyimpanan lokal, drive yang sama / berbeda, penyimpanan jaringan, ..)? Apa skema tabelnya? Apa perintah impor? Apa rencana eksekusi (jika itu T-SQL sederhana)?
Marian

Jawaban:

14

Dugaan saya adalah - jika Anda tidak benar-benar diblokir - bahwa Anda mencapai ambang batas di mana file data (dan / atau file log) harus tumbuh, dan bahwa konfigurasi Anda tidak dioptimalkan untuk mendukung pertumbuhan ini. Memastikan bahwa:

  1. Tingkat pertumbuhan file data Anda masuk akal, dan merupakan ukuran yang tetap (bukan%!) Cukup besar untuk mengakomodasi transaksi ini dan hal lain yang mungkin terjadi secara bersamaan.
  2. Sama untuk file log.
  3. Inisialisasi file instan diaktifkan . Ini akan membantu mempercepat pertumbuhan file data tetapi bukan pertumbuhan file log yang lebih sering.
  4. Anda tidak memasukkan 1,35 juta baris individu dalam satu lingkaran atau sebaliknya semua sebagai satu transaksi besar. Ada sesuatu yang bisa dikatakan untuk memecah transaksi Anda menjadi potongan-potongan .
Aaron Bertrand
sumber
1
Aaron sangat tepat dengan saran-sarannya yang terdengar seperti filegrowth pada data atau file log. Pastikan juga jumlah file log virtual Anda rendah.
Namphibian
4

Mungkinkah ini masalah memori?

Anda bisa melihat perilaku semacam ini jika beberapa data yang harus diakses berulang kali tumbuh terlalu besar untuk memori dan Anda mendapatkan thrash disk dari neraka. Jika Anda harus melakukan perulangan di sebagian besar data yang terlalu besar untuk memori, Anda akan berakhir dengan semuanya dibaca kembali dari file swap untuk setiap pass, mendorongnya melebihi batas itu dapat menyebabkan kinerja Anda jatuh dari tebing.

Loren Pechtel
sumber
3

Apakah Anda mencoba / apakah mungkin untuk membaginya menjadi kelompok-kelompok yang lebih kecil? Ketika saya mengalami masalah yang sama, pengelompokan mereka dengan 5.000 (dengan GO) benar-benar menurunkan waktu yang dibutuhkan untuk menyelesaikan tugas seperti itu.

Alex Szabó
sumber