Memperbarui Dimensi besar yang direplikasi (SQL Server PDW)

8

Kami menggunakan alat SQL Server PDW untuk gudang data kami. Salah satu meja di gudang kami adalah meja yang direplikasi dengan sekitar 20 juta baris. Sebagai bagian dari proses ETL kami, kami perlu kedaluwarsa catatan lama dari dimensi ini; namun, kami melihat bahwa memperbarui beberapa catatan (<100) membutuhkan waktu lebih dari 1 jam untuk menyelesaikan. Inilah yang ingin saya tingkatkan jika saya bisa.

Secara alami, salah satu opsi yang saya pikirkan adalah mengubah Dimensi ini dari Digandakan menjadi Didistribusikan. Pengujian saya menunjukkan bahwa itu akan memperbaiki masalah dengan proses ETL yang lama (dari 1,5 jam turun menjadi 30 detik) tetapi semua gabungan terhadap versi Terdistribusi dari dimensi ini akan terpengaruh karena gabungan hampir tidak pernah didasarkan pada distribusi yang sama kolom. Ketika saya melihat rencana pelaksanaan beberapa pertanyaan ini, saya biasanya melihat operasi ShuffleMove atau BroadcastMove .

Jadi pertanyaan saya kepada guru PDW di sini adalah:

Apakah ada hal lain yang dapat dilakukan untuk meningkatkan kinerja memperbarui catatan dalam versi replikasi Dimensi ini?

Sekali lagi, pindah ke tabel Terdistribusi tampaknya bukan solusi terbaik karena akan memengaruhi ratusan pertanyaan SQL yang sudah ditulis dan laporan yang dikembangkan oleh orang lain.

Icarus
sumber
1
Saya belum melihat banyak pertanyaan PDW di sini, jika Anda tidak mendapatkan jawaban juga coba forum MSDN SQL Server. Ada juga tanggapan cepat. Semoga berhasil.
Ali Razeghi

Jawaban:

5

Beberapa pertanyaan. 20 juta baris belum tentu yang besar.

Proses apa yang Anda gunakan untuk melakukan pembaruan dan menghapus sekarang?

Apakah dimensi tersebut adalah INDEKS CLUSTERED COLUMNSTORE, INDEKS CLUSTERED atau HEAP?

Apakah Anda mengatakan bahwa ada gerakan saat Anda memperbarui dan menghapus tabel ini atau apakah Anda baru saja melihat gerakan ketika Anda mengubah tabel dari yang direplikasi menjadi didistribusikan?

Jika yang terakhir itu tidak mengejutkan. Anda tidak mungkin bergabung dan kompatibel dengan agregasi. Jika Anda melakukan sesuatu untuk memicu gerakan melalui pembaruan / penghapusan Anda, maka kami dapat melihatnya - meskipun contoh nyata akan sangat membantu.

Secara umum saya akan mulai dengan mencoba menjaga ETL tetap sederhana.

Gunakan CTAS terhadap dimensi memilih hanya baris yang ingin Anda pertahankan, bergabung dalam setiap baris baru dan gunakan KASUS untuk mengambil perubahan apa pun (mengubah UPDATE menjadi transformasi dalam CTAS). Setelah selesai, Anda dapat menggunakan sepasang perintah RENAME OBJECT untuk beralih dari tabel saat ini ke tabel baru. Ini memberi Anda manfaat tambahan dari memiliki tampilan bersejarah dari meja Anda - yang dapat Anda jatuhkan sesuka hati.

JRJ
sumber
1

Direplikasi tidak menghentikan Anda menggunakan partisi. Partisi meja Anda.

Kemudian, untuk baris yang perlu Anda hapus atau perbarui, CTAS seluruh partisi ke tabel baru, menggunakan LEFT JOIN dan COALESCE untuk mendapatkan nilai yang sesuai (yaitu baru) untuk pembaruan dari baris yang diubah dengan tetap menjaga baris yang Anda inginkan dan tidak termasuk yang tidak Anda miliki.

Akhirnya, partisi mengganti tabel baru dengan partisi lama Anda.

Dan selesai :)

Dalam pengalaman saya, PDW tidak suka pembaruan dan penghapusan. Sakelar CTAS dan partisi bekerja dengan baik.

Mark Stacey
sumber
1

Pernyataan UPDATE di PDW hanya sebagian paralel daripada paralel sepenuhnya seperti CTAS.

Yang mengatakan, ini bisa turun ke pengindeksan. Apa kode aktual yang Anda jalankan? Apakah Anda memiliki indeks untuk membantu menemukan catatan yang kedaluwarsa itu? Anda masih perlu menerapkan beberapa teknik penyetelan standar menerapkan indeks non-clustered ke tabel rowstore. Fakta bahwa PDW tidak mendukung kunci primer sering tampaknya berarti orang lupa untuk mengindeks kunci alami mereka, jadi jangan temukan diri Anda di kapal itu ...

Rob Farley
sumber