Saya punya tabel dasar dengan transaksi dan saya perlu membuat tabel dengan total berjalan. Saya membutuhkannya per akun dan dan juga memiliki beberapa total berjalan untuk setiap akun (tergantung pada jenis transaksi), dan di dalamnya, beberapa total berjalan per sub-akun.
Tabel dasar saya memiliki bidang-bidang ini (kurang lebih):
AccountID | SubAccountID | TransactionType | TransactionAmount
Mengingat saya memiliki sekitar 4 jenis total berjalan per Akun / TransactionType dan 2 total berjalan lebih per Akun / SubAccount / TransactionType, dan saya punya sekitar 2M akun dengan masing-masing sekitar 10 sub rekening, dan saya mendapatkan sekitar 10 ribu transaksi setiap menit (pada beban maksimum), bagaimana Anda melakukannya?
Ini juga merupakan keharusan bahwa ini dijalankan secara tidak sinkron melalui pekerjaan SQL, membuat agregasi tanpa menjadi bagian dari transaksi itu sendiri.
Saya cukup macet menggunakan kursor di sini - yang terlalu lama. Saya sangat menghargai saran / artikel yang melakukan kurang lebih sama.
sumber
Jawaban:
Asynchronous menyiratkan bahwa total berjalan tidak perlu sepenuhnya akurat setiap saat, atau pola perubahan data Anda sedemikian rupa sehingga total build berjalan satu kali akan valid dan akurat hingga pemuatan berikutnya. Ngomong-ngomong, aku yakin kamu sudah memikirkan bagian itu, jadi aku tidak akan memaksakan intinya.
Pilihan utama Anda untuk metode berperforma tinggi, didukung, adalah fungsi / prosedur SQLCLR, atau
UPDATE
berdasarkan pada metode iterasi berbasis set Hugo Kornelis. Metode SQLCLR (diimplementasikan dalam suatu prosedur, tetapi cukup mudah untuk diterjemahkan) dapat ditemukan di sini .Saya belum dapat menemukan metode Hugo secara online, tetapi ini terinci dalam MVP Deep Dives yang sangat baik (Volume 1). Kode contoh untuk mengilustrasikan metode Hugo (disalin dari salah satu posting saya di situs lain yang mungkin tidak Anda miliki loginnya) ditunjukkan di bawah ini:
Dalam SQL Server 2012, Anda bisa menggunakan ekstensi fungsi windowing misalnya
SUM OVER (ORDER BY)
.sumber
Saya tidak yakin mengapa Anda ingin tidak sinkron, tetapi beberapa tampilan yang diindeks terdengar seperti tiket saja di sini. Jika Anda ingin SUM sederhana per beberapa grup yaitu: define running total.
Jika Anda benar-benar ingin tidak sinkron, dengan 160 baris baru per detik total berjalan Anda akan selalu ketinggalan zaman. Asynchronous berarti tidak ada pemicu atau tampilan indeks
sumber
Menghitung jumlah total yang berjalan sangat lambat, apakah Anda melakukannya dengan kursor atau gabungan segitiga. Sangat menggoda untuk melakukan denormalkan, untuk menyimpan total yang berjalan dalam kolom, terutama jika Anda sering memilihnya. Namun, seperti biasa saat Anda melakukan denormalkan, Anda perlu menjamin integritas data yang didenormalisasi Anda. Untungnya, Anda dapat menjamin integritas menjalankan total dengan kendala - selama semua kendala Anda tepercaya, semua total menjalankan Anda benar.
Juga dengan cara ini Anda dapat dengan mudah memastikan bahwa saldo saat ini (total berjalan) tidak pernah negatif - menegakkan dengan metode lain juga bisa sangat lambat. Script berikut menunjukkan tekniknya.
Disalin dari blog saya
sumber