Mode akses data SSIS Data Flow - apa gunanya 'tabel atau tampilan' vs pemuatan cepat?

9

Menggunakan SQL Server Business Intelligence Development Studio, saya melakukan banyak flat file untuk aliran data tujuan OLE DB untuk mengimpor data ke tabel SQL Server saya. Di bawah "Mode akses data" di dalam editor tujuan OLE DB, defaultnya adalah "tabel atau tampilan" daripada "tabel atau tampilan - muat cepat". Apa bedanya; satu-satunya perbedaan yang dapat saya lihat adalah bahwa pemuatan cepat mentransfer data jauh lebih cepat.

coburne
sumber

Jawaban:

13

Mode Akses Data Komponen Tujuan OLE DB hadir dalam dua rasa - cepat dan tidak cepat.

Cepat, "tabel atau tampilan - pemuatan cepat" atau "tabel atau variabel nama tampilan - pemuatan cepat" berarti bahwa data akan dimuat dengan mode berbasis-set.

Lambat - "tabel atau tampilan" atau "tabel atau variabel nama tampilan" akan menghasilkan SSIS yang mengeluarkan pernyataan menyisipkan tunggal ke database. Jika Anda memuat 10, 100, bahkan mungkin 10.000 baris, mungkin ada sedikit perbedaan kinerja yang cukup besar antara kedua metode. Namun, pada titik tertentu Anda akan menjenuhkan contoh SQL Server Anda dengan semua permintaan kecil piddly ini. Selain itu, Anda akan menyalahgunakan daftar transaksi Anda.

Mengapa Anda menginginkan metode yang tidak cepat? Data buruk. Jika saya mengirim 10.000 baris data dan baris ke-9999 bertanggal 2015-02-29, Anda akan mendapatkan 10k entri atom dan komit / kembalikan. Jika saya menggunakan metode Cepat, seluruh kumpulan 10k baris itu akan disimpan atau tidak ada. Dan jika Anda ingin tahu baris mana yang salah, tingkat granularitas terendah yang Anda miliki adalah baris 10rb.

Sekarang, ada pendekatan untuk mendapatkan sebanyak mungkin data dimuat secepat mungkin dan masih menangani data kotor. Ini adalah pendekatan kegagalan berjenjang dan terlihat seperti itu

masukkan kegagalan cascading

Idenya adalah Anda menemukan ukuran yang tepat untuk memasukkan sebanyak mungkin dalam satu kesempatan tetapi jika Anda mendapatkan data yang buruk, Anda akan mencoba menyimpan kembali data dalam batch yang lebih kecil secara berturut-turut untuk mendapatkan baris yang buruk. Di sini saya mulai dengan ukuran komit masukkan maksimum (FastLoadMaxInsertCommit) dari 10000. Pada disposisi Baris Kesalahan, saya mengubahnya Redirect Rowdari Fail Component.

Tujuan berikutnya sama seperti di atas tetapi di sini saya mencoba memuat cepat dan menyimpannya dalam batch 100 baris. Sekali lagi, uji atau buat kepura-puraan untuk membuat ukuran yang masuk akal. Ini akan menghasilkan 100 kumpulan 100 baris yang dikirim karena kita tahu di suatu tempat di sana, setidaknya ada satu baris yang melanggar batasan integritas untuk tabel.

Saya kemudian menambahkan komponen ketiga ke dalam campuran, kali ini saya menghemat dalam batch 1. Atau Anda bisa mengubah mode akses tabel dari versi Fast Load karena akan menghasilkan hasil yang sama. Kami akan menyimpan setiap baris secara individual dan itu akan memungkinkan kami untuk melakukan "sesuatu" dengan satu baris buruk.

Akhirnya, saya memiliki tujuan yang gagal. Mungkin itu tabel "sama" dengan tujuan yang dituju tetapi semua kolom dinyatakan sebagai nvarchar(4000) NULL. Apa pun yang berakhir di meja itu perlu diteliti dan dibersihkan / dibuang atau apa pun proses resolusi data Anda yang buruk. Lainnya membuang ke file datar tapi sungguh, apa pun yang masuk akal untuk bagaimana Anda ingin melacak data yang buruk berfungsi.

billinkc
sumber
5

Fast Load didokumentasikan dengan baik di bawah opsi LOAD CEPAT

  • Menyimpan nilai identitas dari file data yang diimpor atau menggunakan nilai unik yang diberikan oleh SQL Server.

  • Pertahankan nilai nol selama operasi beban massal.

  • Periksa kendala pada tabel target atau tampilan selama operasi impor massal.

  • Dapatkan kunci level-tabel selama durasi operasi beban massal. Tentukan jumlah baris dalam kumpulan dan ukuran komit.


Apa bedanya; satu-satunya perbedaan yang dapat saya lihat adalah bahwa pemuatan cepat mentransfer data jauh lebih cepat.

Di bawah tenda, table or viewakan menggunakan Perintah SQL individu untuk setiap baris untuk memasukkan vs table or view - with fast loadakan menggunakan perintah BULK INSERT.

Jika Anda melihat opsi di atas yang tersedia di BULK INSERT misalnya number of rows in the batch= ROWS_PER_BATCHdan commit size=BATCHSIZE

Skenario lain adalah ..

Ukuran Komit Maksimum bawaan bawaan (2147483647) terlalu tinggi. Jadi misalnya Anda memasukkan baris 500K dan karena pelanggaran PK batch gagal. Dalam skenario ini, seluruh kumpulan akan gagal ketika Anda menggunakan opsi FAST LOAD. Anda tidak akan bisa mendapatkan deskripsi kesalahan juga.

Di sinilah Anda dapat memiliki table or viewsebagai output Kesalahan tujuan. Jadi dari 500K, Anda menggunakan FAST LOAD sebagai dimulai dengan memasukkan ukuran komit 5K. Jika 1 baris dalam batch gagal, Anda akan mengarahkan 5K batch tersebut ke table or viewload - yang menggunakan baris demi baris HANYA untuk 5K baris dan Anda juga bisa mengarahkan kesalahan table or viewke file flat .. sehingga jika ada baris gagal batch jika 5K, Anda akan dapat menentukan dengan tepat apa yang menyebabkan kegagalan.

Keuntungan dari metode di atas adalah jika tidak ada baris yang gagal, maka akan menggunakan BULK INSERT (fast load) untuk seluruh batch.

Pecinta SSIS billinkc menjawab pertanyaan serupa di Stackoverflow .

Kin Shah
sumber