Saya memiliki database tempat saya memuat file ke dalam tabel pementasan, dari tabel pementasan ini saya memiliki 1-2 bergabung untuk menyelesaikan beberapa kunci asing dan kemudian memasukkan baris ini ke dalam tabel akhir (yang memiliki satu partisi per bulan). Saya memiliki sekitar 3,4 miliar baris selama tiga bulan data.
Apa cara tercepat untuk mendapatkan baris ini dari pementasan ke meja final? SSIS Data Flow Task (yang menggunakan view sebagai sumber dan memiliki fast load aktif) atau perintah Insert INTO SELECT ....? Saya mencoba Data Flow Task dan bisa mendapatkan sekitar 1 miliar baris dalam waktu sekitar 5 jam (8 core / 192 GB RAM di server) yang terasa sangat lambat bagi saya.
Jawaban:
Satu pendekatan umum:
INSERT dbo.[Target] WITH (TABLOCKX) SELECT ...
n
baris, yang dapat mengurangi ketegangan pada log transaksi, dan tentu saja berarti bahwa jika beberapa batch gagal, Anda hanya perlu memulai dari batch itu. Saya membuat blog tentang ini (sementara mengacu pada penghapusan, konsep dasar yang sama berlaku) di sini: http://www.sqlperformance.com/2013/03/io-subsystem/chunk-deletesJika partisi Anda bersifat fisik dan bukan hanya logis, Anda dapat memperoleh waktu dengan memiliki proses yang berbeda mengisi partisi yang berbeda secara bersamaan (tentu saja ini berarti Anda tidak dapat menggunakan
TABLOCK
/TABLOCKX
). Ini mengasumsikan bahwa sumber juga cocok untuk memilih beberapa proses tanpa tumpang tindih / mengunci dll, dan membuat sisi operasi lebih lambat (petunjuk: buat indeks berkerumun pada sumber yang sesuai dengan skema partisi pada tujuan).Anda juga dapat mempertimbangkan sesuatu yang jauh lebih primitif, seperti
BCP OUT
/BCP IN
.Saya tidak tahu bahwa saya akan melompat ke SSIS untuk membantu ini. Mungkin ada beberapa efisiensi di sana, tetapi saya tidak tahu bahwa upaya itu membenarkan penghematan.
sumber
Melihat masalah Anda dari sudut pandang SSIS, saya merasa alasan mengapa hal ini memakan waktu begitu lama adalah karena Anda tidak melakukan batching. Ini dapat menyebabkan terlalu banyak baris yang mengisi pipa SSIS dan sebagai akibatnya dapat menghambat kinerja SSIS Anda. Yang perlu Anda lakukan adalah mengubah baris Anda per pengaturan batch dan mungkin ukuran komit insert maksimum Anda. Sekarang apa yang Anda atur ini juga akan tergantung pada jumlah memori yang tersedia untuk server SSIS Anda? Berapa kecepatan disk instance SQL Server Anda? Cara terbaik untuk melakukan ini adalah tes. Misalnya, gunakan 10.000. Ini akan mengirim batch ke server 10.000 pada saat yang sama sehingga menjaga pipa Anda dari pengisian berlebih dan akan membantu menjalankan proses ini lebih cepat. Pengaturan ini diatur di tujuan OLEDB Anda.
Jika ini merupakan masalah, Anda juga dapat menambahkan menjalankan tugas SQL sebelum dan sesudah untuk melakukan seperti yang disarankan @AaronBertrand dan menghapus / menambahkan kembali setiap indeks atau kendala ke tabel.
sumber