Pertanyaan:
Saya memiliki skrip dengan sekitar 45 ribu sisipan dari pernyataan pilih. Ketika saya mencoba dan menjalankannya, saya mendapatkan pesan kesalahan yang menyatakan bahwa saya kehabisan memori. Bagaimana saya bisa menjalankan skrip ini?
Konteks:
- Menambahkan beberapa bidang data baru untuk membuat aplikasi bermain bagus dengan aplikasi lain yang digunakan klien.
- Mendapat spreadsheet data dari klien yang penuh dengan data yang memetakan item data saat ini ke nilai untuk bidang baru ini.
- Spreadsheet yang dikonversi untuk menyisipkan pernyataan.
- Jika saya hanya menjalankan beberapa pernyataan itu berfungsi tetapi seluruh skrip tidak.
- Tidak. Tidak ada kesalahan ketik.
Jika ada cara yang berbeda saya harus memuat data ini merasa bebas untuk menghukum saya dan memberi tahu saya.
sql-server
sql-server-2005
etl
spaghetticowboy
sumber
sumber
Jawaban:
Ukuran batch maksimum untuk SQL Server 2005 adalah 65.536 * Ukuran Paket Jaringan (NPS), di mana NPS biasanya 4KB. Itu berhasil hingga 256 MB. Itu berarti bahwa pernyataan insert Anda akan rata-rata 5,8 KB masing-masing. Itu kelihatannya tidak benar, tapi mungkin ada ruang asing atau sesuatu yang tidak biasa di sana.
Saran pertama saya adalah meletakkan pernyataan "GO" setelah setiap pernyataan INSERT. Ini akan memecah batch tunggal Anda dari 45.000 laporan INSERT menjadi 45.000 batch terpisah. Ini seharusnya lebih mudah dicerna. Hati-hati, jika salah satu sisipan gagal, Anda mungkin kesulitan menemukan pelakunya. Anda mungkin ingin melindungi diri Anda dengan transaksi. Anda dapat menambahkan pernyataan tersebut dengan cepat jika editor Anda memiliki pencarian dan penggantian yang baik (yang akan memungkinkan Anda mencari dan mengganti karakter yang dikembalikan seperti \ r \ n) atau fasilitas makro.
Saran kedua adalah menggunakan Wisaya untuk mengimpor data langsung dari Excel. Wisaya membuat paket SSIS kecil untuk Anda, di belakang layar, dan kemudian menjalankannya. Itu tidak akan memiliki masalah ini.
sumber
GO
setelah setiap pernyataan? Yah, saya kira jika Anda membuat mereka menggunakan skrip lain tidak apa-apa. Kalau tidak, saya hanya akan menempatkan satu setelah setiap 1000INSERT
s. Berkenaan dengan membuat transaksi atomik dan meminimalkan ukuran transaksi, mengapa tidak memuat semua baris ke tabel temp atau variabel tabel dan kemudian memuatnya dalam satu tembakan dari sana ke tabel target?BULK INSERT
ataubcp
tampaknya opsi yang lebih tepat daripada 45.000 pernyataan insert.Jika Anda harus tetap menggunakan pernyataan insert, saya akan mempertimbangkan beberapa opsi:
A: Gunakan transaksi dan bungkus batch 100 atau 500 atau 1000 pernyataan di masing-masing untuk meminimalkan dampak pada log dan batch. misalnya
B: Alih-alih pernyataan penyisipan individual, gunakan
UNION ALL
untuk 100 atau 500 pernyataan sekaligus, misSaya telah meninggalkan kesalahan penanganan untuk singkatnya, tetapi intinya adalah bahwa saya tidak akan pernah mencoba mengirim batch tunggal 45.000 laporan individu ke SQL Server.
sumber
VARCHAR(800)
kolom pada 2008 dengan waktu kompilasi 12,5 menit pada contoh dev 2008 saya karena ia melakukan banyak pekerjaan yang tidak perlu membandingkan nilai daripada hanya melanjutkan dengan memasukkannya (melakukan banyak lebih cepat ketika parameter dan tidak ada nilai untuk dilihat). Meskipun jauh lebih baik pada tahun 2012, pola non-linear masih ada & harus diperbaiki dalam versi setelahnya.Saya tidak yakin mengapa Anda keluar dari kesalahan memori, tetapi ada pendekatan yang lebih mudah.
Jika Anda dapat mengekspor data dari spreadsheet ke dalam format yang dibatasi (mis. Csv), Anda dapat menggunakan panduan impor data di SSMS untuk memasukkan data untuk Anda:
sumber
Menggunakan beberapa SqlBulkCopy, buat tabel temp. Masukkan data baru ke tabel temp, kemudian gabungkan data di tabel temp ke yang sudah ada. Contoh menggunakan Metode C # SqlBulkCopy.WriteToServer (DataTable) . Semoga ini bisa membantu
sumber
Ya kita bisa melakukan itu, saya mencoba dengan pendekatan BCP (Bulk Copy Program) untuk menghindari masalah OutOfMemory .
Catatan : Mencoba di SQL Server 2014.
Di BCP, pertama-tama kita perlu mengekspor data basis data Sumber ke file bcp (dalam folder direktori lokal) dan kemudian perlu mengimpor file bcp ke database tujuan.
Berikut adalah langkah-langkah kue berjalan:
catatan:
a) Pastikan tabel kosong ada di database Tujuan
b) Pastikan folder Temp ada di drive C.
Buat file kelelawar bernama Export_Data.bat dengan perintah di bawah ini:
jeda
Jalankan file bat itu, sebagai akibatnya file bcp akan dihasilkan di folder Temp
Kemudian buat file kelelawar lain bernama Import_Data.bat dengan perintah berikut:
Jeda
Dan ini dia!
sumber