SQL Server 2008 R2への挿入が最初にRAMにキャッシュされることをどのように保証できますか?


17

「バースト性」のデータストリームを想像してください。つまり、10,000個のイベントが非常に速く到着し、その後1分間何も続かない場合があります。

ここに画像の説明を入力してください

あなたの専門家のアドバイス:SQLのC#挿入コードを書くと、SQLがすべてのデータをRAMにキャッシュするという保証があります。これを達成するために、SQLサーバー自体のセットアップのパターン、または書き込み先の個々のSQLテーブルをセットアップするパターンを知っていますか?

もちろん、RAMに独自のキューを作成するという独自のバージョンを実行できますが、いわば旧石器時代の石Aを再発明したくありません。


1
C#クライアントコードについて話しているのですか?書き込みがキャッシュされることを保証するSQLコードに興味がありますか?
リチャード

6
RDBMSでサポートされている場合でも、(a)それほど難しくない、(b)完全に管理下にある、(c)ベンダーに依存しないため、自分でキュー挿入を行いたいと思います。

書き込みがキャッシュされるようにするためのSQLコードを含むC#クライアントコードに興味があります。ただし、「T-SQLをそのまま使用して、独自のC#ラッパーを作成できると確信しています。」

回答:


11

書いてみて、何が起こるか見てみましたか?既知のボトルネックはありますか?

アプリがブロックされるのを防ぐ必要がある場合、書き込みをキューに入れてデータベース呼び出しを延期する方法があります。ただし、1秒または2秒でキューがクリアされると思われますが、これで問題ない場合はキューが必要ですか?

または、ステージングテーブルにスプールして、後でフラッシュできますか?この手法を使用して、1分あたり何百万もの新しい行の持続的な書き込みを処理します(実際にはシンプルリカバリのステージングDBを使用します)。しかし、行の書き込みの経験があるまで実装しませんでした。

注:SQL Serverのすべての書き込みがされます書き込みログ先行(WAL)プロトコルの一部としてディスクを行う行きます。これは、その書き込みのt-logエントリに適用されます。

行を含むデータページは、ある時点でディスクに移動します(時間、使用、メモリ負荷などに基づきます)が、通常、データはとにかくメモリに格納されます。これは「チェックポイント」と呼ばれ、メモリからデータを排除せず、変更をフラッシュするだけです(2011年11月24日編集)

編集:

上記の最後の段落に基づいた全体的な考慮事項については、このデータベースのLDFを専用のディスクセットにシフトして、パフォーマンスを向上させます。ステージングデータベース(MDF / LDFごとに1つ)に同じ。データベースサーバーに(通常はSANを介して)数十または3つの異なるボリュームを使用することは非常に一般的です


1
おそらく、ステージングテーブルへのスプールが最善の方法です。また、数十億の行テーブルがある環境で働いている友人の1人から確認を受けました。彼は、より高速な分析のために一時テーブルを使用すると述べました。

7

何かが足りない場合を除き、これはACIDの耐久性要件(http://en.wikipedia.org/wiki/ACID)に違反します。つまり、アプリケーションがデータをRAMに「書き込み」、サーバーがクラッシュすると、データは失われます。

したがって、求めるのは、データベースへの最終的なストレージのキューとして機能する非データベースシステムか、実行中の処理に対して十分に高速なデータベースシステムのいずれかです。最初に後者を試してみて、それで十分かどうかを確認することをお勧めします。トラブルを借りないでください。


+1これに言及すべきでした。ACIDにはWALが必要です
-gbn

2

このために一度データセットを使用しました。到着したデータセットに行を挿入していましたが、2秒ごとにデータベースに行をフラッシュする別のスレッドがありました。また、xmlドキュメントを使用してcachinを実行し、1回の呼び出しでxmlをデータベースに渡すこともできます。これはさらに優れている場合があります。

よろしく

ピョートル

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.