質問: これを行う最速の方法は何ですか? * 1つのテーブル、私はプレフィルできないリファレンスはありません(つまり、そこに1つのリファレンスキーがありますが、すべてのデータが入っています) * 大量のデータ1日に何億行もの行があり、APIを使用して動的にアクセスします * リクエストは、ほぼリアルタイムのシナリオで実行可能な限り速やかに処理する必要があります(つまり、1日1回アップロードするファイルに書き込む必要はありません)。 2秒は通常の最大遅延です * データ/アプリケーションとSQL Serverのためのマシンを分離する 今私がしていること: * 最大32行×1024行を配列に集約してキューに入れます。 * 2-3のスレッドでキューを読み取ります。 SqlBulkCopyを使用してデータベースに挿入します。 私は1秒間に約60k-75k行をインポートしますが、それは十分ではありませんが、かなり近いです。私は250.000行をヒットするのが大好きです。 これまでは何も実際に使用されていません。私は20%の時間 "ネットワークI / O"ブロックを得、1つのコアの80%がCPU側にロードされている。ディスクは、主にアイドル状態で、7MB〜14MBを書き出しています。 6ラプタのRAID 10の平均キュー長は.... 0.25です。 誰もどのようにこれをスピードアップするアイデア?より速いサーバー(これまでは仮想、8GBのラム、4コア、物理ディスクのパススルー)。 --- いくつかの説明を追加する: * これは、2008 R2サーバー上の2008 R2エンタープライズSQL Serverです。マシンには4つのコア、8GBのRAMがあります。全64ビット。 80%の負荷平均はこのマシンから約20%のCPU負荷を示します。 * テーブルはシンプルで、プライマリキーがなく、リレーショナルリファレンス(機器参照)のインデックスとユニーク(機器のセット内で、これは強制されないので)タイムスタンプです。 * テーブルのフィールドは、タイムスタンプ、計器参照(強制外来キーなし)、データタイプ(char 1、何のデータがポストされているかを示す文字の1つ)、価格(倍数)、およびボリューム(int)です。ご覧のとおり、これは非常に薄いテーブルです。問題のデータは、金融商品のティックデータです。 * 質問はハードウェアなどについてもあります。なぜなら私は実際のボトルネックがないからです。私は複数の取引に挿入しています。それは私に利益をもたらしますが、小さなものです。 CPUはかなりの負荷を示していません、ネットワーク待機は高いです(現在300%/秒、30%)。私はかなり "別のサーバーを購入する"ことにオープンしていますが、ボトルネックを最初に特定したいと思います....特に、ボトルネックが何であるかを把握していないことを考えると、ロギングは関係ありません。バルク挿入物はデータ(クラスタ化されたインデックスなし)としてデータログに入れられません。 垂直パーティショニングは、たとえば16のテーブルなどで楽器の宇宙を分割するバイト(tinyint)や、同時に16個のインサートを行う場合などに役立ちますか?実際にはデータが異なるエクスチェンジから来るので、私は交換ごとにパーティションを作ることができます。これは自然な分割フィールドです(実際には楽器ですが、ここでこのデータを複製できます)。 --- さらにいくつかの解説:マシン間のネットワークIOによって明確に制限された、さらに高速な(90k)速度を得ました。これは、VMスイッチングである可能性があります。 私が今やっていることは、32k行ごとに接続を行い、一時テーブルを作成し、SqlBUlkdCopyでこれを挿入し、次に1つのSQL文を使用してメインテーブルにコピーし、メインテーブルのロック時間を最小限に抑えます。 ほとんどの待ち時間はまだネットワークIO上にあります。私はVMが賢明なところで問題に遭遇しているようだ。次の数ヶ月で物理的なハードウェアに移行します;)
回答: 1秒間に70k行を管理するなら、これまでのところとても幸運です。しかし、私はあなたが非常にシンプルなスキーマを持っているからだと思う。 私はこの種の負荷について * 仮想サーバー * 単一配列 * SATAディスク ネットワークとCPUは共有され、IOは制限されています。すべてのリソースを使用することはできません。あなたが見る荷重統計はそれほど有用ではありません。私は2つの仮想サーバ間のトラフィックがあなたが見るネットワーク負荷であると思っています。これを解決すればIOバウンドになります 私が続ける前に、35Kのtpsからこの10のレッスンを読んでください 。彼はバーチャルボックスを使用していませんでした。 ボリュームを増やしたい場合は、SANとDR機能がないと仮定して、私がやることはここにあります。 * 2つの大きなphyicalサーバーを買う、無関係のCPU RAMの種類、最大RAM、x64のインストールに行く * ディスク+コントローラ=最速のスピンドル、最速のSCSIまたは、素晴らしいNAS * 1000MB以上のNIC * **データベースの** **1つの**ログファイルに**のみ** 6-10のディスクを使用するRAID 10 * データファイル用の残りのディスクRAID 5またはRAID 10 参考までに、ピーク負荷は1時間に1200万行(16コア、16GB、SAN、x64)ですが、負荷が複雑です。私たちは能力がありません。