Bagaimana cara menentukan apakah transformasi SSIS adalah non-blocking, blocking sebagian, atau sepenuhnya blocking?

12

Ada beberapa blog yang mengklaim mengkategorikan Transformasi SSIS menjadi pemblokiran (asinkron), non-pemblokiran (sinkron) dan sebagian pemblokiran (asinkron).

Ketika melihat pertanyaan spesifik: Apakah multicast sinkron (non-blocking) atau asynchronous (sebagian memblokir)?

Salah satu sumber mengklaim async: "Multicast adalah transformasi asinkron (juga dikenal sebagai pemblokiran sebagian)" sumber: http://social.technet.microsoft.com/wiki/contents/articles/7392.ssis-multicast-transformation.aspx

dan sinkron lainnya: https://jorgklein.com/2009/04/14/ssis-lookup-is-case-sensitive/

Sumber daya lain mengklaim transformasi DQS Cleansing adalah transformasi non-blocking, tetapi bagi saya tampaknya sebagian memblokir.

Harap jangan menjawab dengan tautan ke daftar transformasi yang dikategorikan berdasarkan jenis. Jawaban untuk pertanyaan ini diharapkan akan memungkinkan metode yang lebih keras untuk MEMBUKTIKAN jawaban yang benar.

Karena transformasi pemblokiran dan pemblokiran sebagian akan memindahkan data ke buffer baru sebagai lawan dari non-pemblokiran yang beroperasi pada buffer di tempat, saya menduga bahwa solusinya adalah menonton pembuatan buffer selama eksekusi transformasi, tetapi saya tidak yakin (a ) jika ini akan menghasilkan jawaban yang pasti dan (b) bagaimana melakukan ini.

Saya percaya bahwa transformasi non-pemblokiran tidak akan menyebabkan pohon eksekusi baru dimulai, jadi ada kemungkinan bahwa jawabannya terletak pada pencatatan PipelineExectionTrees dan PipelineExecutionPlan. Ini mungkin membedakan antara sinkron dan asinkron, tetapi mungkin tidak membedakan antara sebagian memblokir dan sepenuhnya memblokir.

Thronk
sumber
3
Mulitcast sinkron. Tes quick sniff untuk synch vs async adalah apakah lineageid (pra 2012) tetap sama sebelum dan sesudah transformasi. Biarkan saya melihat ke 2012 dan bagaimana cara kerjanya sekarang.
billinkc
2
Memblokir perilaku dan sinkronisitas bukanlah hal yang sama. Sinkronisitas adalah tentang apakah data perlu dipindahkan ke buffer baru atau tidak, sedangkan pemblokiran adalah tentang apakah setiap baris dapat ditangani dengan segera atau tidak. Misalnya, Union All adalah non-blocking, tetapi asynchronous - itu menciptakan buffer baru dan thread eksekusi baru, tetapi tidak perlu menunggu untuk melakukan itu.
Rob Farley
@Rob - sementara saya setuju mereka bukan hal yang sama (asynchronous dapat memblokir sebagian atau sepenuhnya) - Blog jorg_klein sebenarnya menyatakan bahwa Union All sebagian memblokir. Saya cenderung setuju seolah-olah data dipindahkan ke buffer baru, intuisi membuat saya berpikir bahwa sebagian akan diblokir. Jika dia bisa dibuktikan salah dan intuisi saya salah, semuanya akan lebih baik daripada menjawab pertanyaan!
Thronk
Adakah yang punya ide tentang bagaimana ini bisa diuji? Saya kira log kinerja atau informasi dapat digunakan untuk mengetahui hal ini dengan pasti, tetapi saya tidak terlalu yakin yang mana.
Nick.McDermaid
1
Bagi mereka yang mungkin ingin menguji tip

Jawaban:

4

Operasi yang memblokir harus menunggu sampai semua baris terlihat dan ditangani sebelum dapat mulai mengisi buffer.

Operasi yang sebagian-blokir menulis data ke buffer baru, yang hanya bisa ditangani oleh operasi berikutnya setelah setiap buffer (biasanya hanya di bawah 10.000 baris) diisi.

Operasi yang non-pemblokiran dapat membuat operasi selanjutnya bekerja pada buffer yang sama, karena setiap baris ditangani.

Tetapi banyak teks akan menyebut 'pemblokiran sebagian' sebagai 'non-pemblokiran', karena perilakunya jauh lebih dekat dengan 'non-pemblokiran' daripada 'pemblokiran'.

Anda harus bisa mengetahui apa yang terjadi dengan menonton aliran data berjalan, dan melihat ketika jumlahnya meningkat di setiap titik.

Rob Farley
sumber