SQL Server 2008 R2'ye eklenenlerin önce RAM'de önbelleğe alındığını nasıl garanti edebilirim?


17

"Çabuk" bir veri akışı düşünün, yani çok hızlı bir şekilde 10.000 olay gelmesi ve ardından bir dakika boyunca hiçbir şey gelmemesi olabilir.

resim açıklamasını buraya girin

Uzman tavsiyeniz: SQL Server için C # ekleme kodunu nasıl yazabilirim, böylece SQL uygulamamı söz konusu RAM'e veri beslemek için gerekenden daha fazla engellemeden hemen her şeyi kendi RAM'inde önbelleğe alır. Bunu başarmak için SQL sunucusunun kendi kurulumunu veya yazdığım tek tek SQL tablolarını ayarlamak için kalıpları biliyor musunuz?

Tabii ki, RAM'de kendi kuyruğumu oluşturmayı içeren kendi versiyonumu yapabilirdim - ama Paleolitik Taş Baltayı yeniden icat etmek istemiyorum.


1
C # istemci kodundan mı bahsediyorsunuz? Yazmaların önbelleğe alınmasını sağlayan SQL koduyla ilgileniyor musunuz?
Richard

6
RDBMS bunu destekliyorsa, kendimi EVEN sıraya sokmaya eğilimliyim çünkü (a) zor değil, (b) tamamen kontrolünüz altında ve (c) satıcıya bağlı değil.

Yazmaların önbelleğe alınmasını sağlamak için SQL kodunu içeren C # istemci kodunda ilgi duyuyorum. Ancak, ben düz T-SQL ile çalışmak ve kendi C # sarmalayıcı yazabilirsiniz eminim

Yanıtlar:


11

Sadece yazmayı denediniz ve ne olduğunu gördünüz mü? Bilinen bir darboğazınız var mı?

Uygulamanızın engellenmesini önlemeniz gerekiyorsa, veritabanı çağrısını ertelemek için yazma işlemlerini sıraya almanız gerekir. Ancak, kuyruğun bir saniye içinde veya 2'de temizlenmesini beklerdim: bu durumda bir kuyruğa ihtiyacınız var mı?

Yoksa bir evreleme masasına biriktirebilir ve daha sonra yıkayabilir misiniz? Dakikada milyonlarca yeni satırın sürekli yazımlarıyla uğraşmak için bu tekniği kullanıyoruz (aslında Basit kurtarma ile bir hazırlama DB'si kullanıyoruz): ancak sadece satır yazma tecrübesi olana kadar uygulamıyorduk.

Not: SQL Server Her yazma edecek Yaz ileriye günlüğü (WAL) protokolü kapsamında diski yapmak gidin. Bu, söz konusu yazma işleminin t-günlük girişi için geçerlidir.

Satırlı veri sayfası bir noktada diske gider (zaman, kullanım, bellek basıncı vb. Temel alınarak), ancak genellikle verileriniz yine de bellekte olacaktır. Buna "Checkpointing" denir ve bellekten veri çıkarmaz, sadece değişiklikleri temizler (editör 24 Kas 2011)

Düzenle:

Yukarıdaki son paragrafa dayanarak, tüm değerlendirmelerde, bu veritabanı için LDF'nizi daha fazla performans için ayrılmış bir disk grubuna kaydırın. Bir hazırlama veritabanına (her biri MDF / LDF için). Veritabanı sunucunuz için bir düzine veya 3 farklı birime (normalde SAN üzerinden) sahip olmak oldukça yaygındır


1
Bir evreleme masasına biriktirmek muhtemelen en iyi yoldur. Ben de milyar satır tabloları olan bir ortamda çalışan arkadaşlarımdan bir onay aldım, daha hızlı analiz için geçici tablolar kullandığını söyledi.

7

Bir şeyi kaçırmadıkça, ACID'nin Dayanıklılık gereksinimi ( http://en.wikipedia.org/wiki/ACID ) ihlal eder . Yani, uygulamanız verileri RAM'e "yazarsa" ve sunucu çökerse, verileriniz kaybolur.

Yani, aradığınız şey, bir veritabanına nihai depolama için bir sıra olarak hizmet veren veritabanı olmayan bir sistemdir veya yaptığınız şey için yeterince hızlı bir veritabanı sistemidir. Önce ikincisini denemenizi ve yeterli olup olmadığını görmenizi öneririm; bela ödünç alma.


+1 Bundan bahsetmeliydim.
WID

2

Bunun için bir kez Veri Kümesi kullandım. Veri kümesine geldiğinde satır ekliyordum ve her 2 saniyede bir veritabanına satırları temizleyen başka bir iş parçacığı vardı. Ayrıca, önbelleğe almak için xml belgesini kullanabilir ve daha sonra xml'yi bir çağrıda veritabanına geçirebilirsiniz, bu daha da iyi olabilir.

Saygılarımızla

Piotr

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.