Bagaimana saya bisa menjamin bahwa sisipan ke SQL Server 2008 R2 di-cache terlebih dahulu dalam RAM?

17

Bayangkan aliran data yang "meledak", yaitu bisa membuat 10.000 peristiwa tiba dengan sangat cepat, diikuti tanpa apa pun selama satu menit.

masukkan deskripsi gambar di sini

Nasihat ahli Anda: Bagaimana saya bisa menulis kode penyisipan C # untuk SQL Server, sedemikian sehingga ada jaminan bahwa SQL segera menyimpan semuanya dalam RAM-nya sendiri, tanpa memblokir aplikasi saya lebih dari yang diperlukan untuk memasukkan data ke dalam RAM yang dikatakan? Untuk mencapai ini, apakah Anda tahu ada pola untuk pengaturan SQL server itu sendiri, atau pola untuk mengatur tabel SQL individu yang saya tulis?

Tentu saja, saya bisa melakukan versi saya sendiri, yang melibatkan membangun antrian saya sendiri di RAM - tetapi saya tidak ingin menemukan kembali Paleolithic Stone Axe, jadi untuk berbicara.

Contango
sumber
1
Apakah Anda berbicara tentang kode klien C #? Jadi, Anda tertarik dengan kode SQL yang memastikan bahwa penulisan di-cache?
Richard
6
Saya cenderung mengantri menyisipkan diri BAHKAN jika RDBMS mendukungnya karena (a) tidak sulit, (b) itu sepenuhnya di bawah kendali Anda, dan (c) itu bukan tergantung pada vendor.
Saya tertarik dengan kode klien C # yang berisi kode SQL untuk memastikan penulisan di-cache. Namun, saya yakin bahwa saya bisa bekerja dengan T-SQL langsung dan menulis bungkus C # saya sendiri.

Jawaban:

11

Sudahkah Anda mencoba hanya menulis dan melihat apa yang terjadi? Apakah Anda memiliki hambatan yang diketahui?

Jika Anda perlu mencegah aplikasi Anda diblokir, maka Anda salah satu caranya adalah dengan mengantri tulisan untuk menunda panggilan basis data. Namun, saya berharap antrian untuk menghapus dalam satu atau 2 detik: jadi apakah Anda perlu antrian jika ini OK?

Atau Anda bisa menggulung ke meja panggung dan kemudian menyiramnya nanti? Kami menggunakan teknik ini untuk menangani penulisan berkelanjutan jutaan baris baru per menit (kami benar-benar menggunakan DB pementasan dengan pemulihan Sederhana): tetapi kami tidak menerapkannya sampai kami memiliki pengalaman hanya menulis baris.

Catatan: Setiap penulisan dalam SQL Server akan dilakukan sebagai bagian dari protokol Write Ahead Logging (WAL). Ini berlaku untuk entri t-log untuk penulisan itu.

Halaman data dengan baris akan pergi ke disk di beberapa titik (berdasarkan waktu, penggunaan, tekanan memori dll) tetapi umumnya data Anda akan tetap dalam memori. Ini disebut "Checkpointing" dan tidak mengusir data dari memori, hanya menghapus perubahan (diedit 24 Nov 2011)

Edit:

Untuk seluruh pertimbangan, berdasarkan paragraf terakhir di atas, pindahkan LDF Anda untuk basis data ini ke satu set disk khusus untuk kinerja lebih tinggi. Ditto database pementasan (masing-masing untuk MDF / LDF). Sangat umum untuk memiliki selusin atau 3 volume berbeda (melalui SAN biasanya) untuk server database Anda

gbn
sumber
1
Menggulung ke meja pementasan mungkin adalah cara terbaik untuk pergi. Saya juga sudah mendapat konfirmasi dari salah satu teman saya, yang bekerja di lingkungan dengan miliar tabel baris, katanya menggunakan tabel temp untuk analisis yang lebih cepat.
7

Kecuali jika saya melewatkan sesuatu, ini akan melanggar persyaratan Durability dari ACID ( http://en.wikipedia.org/wiki/ACID ). Artinya, jika aplikasi Anda "menulis" data ke RAM dan kemudian server crash, data Anda hilang.

Jadi, apa yang Anda cari adalah sistem non-basis data yang berfungsi sebagai antrian untuk penyimpanan akhirnya ke dalam basis data atau sistem basis data yang cukup cepat untuk apa yang Anda lakukan. Saya sarankan mencoba yang terakhir terlebih dahulu dan melihat apakah itu cukup; jangan pinjam masalah.

Ben Thul
sumber
+1 Saya seharusnya menyebutkan ini. WAL diperlukan untuk ACID
gbn
2

Saya pernah menggunakan Dataset untuk ini. Saya memasukkan baris ke dataset saat mereka tiba, dan ada utas lain yang menyiram baris setiap 2 detik ke database. Anda juga dapat menggunakan dokumen xml untuk melakukan cachin, dan kemudian meneruskan xml ke database dalam satu panggilan, ini mungkin bahkan lebih baik.

Salam

Piotr

Piotr Rodak
sumber