2012-01-05 13 views
0

ここでは、もう1つ問題があります。複数のテーブルを1つのテーブルに入れよう

私はビジネスロジックを実行し、結果をテーブルに挿入する1つのWebサービスを持っています。私のアプリケーションの負荷が最小であれば、これはうまく動作します。

負荷が大きい場合、私のINSERT SQLステートメントがタイムアウトしました。私は接続タイムアウトとコマンドタイムアウトを増やしました。しかし、問題は、同じWebメソッドを呼び出すスレッドが多すぎるということです。ちょうどいくつかのヒントを与えるために、重い負荷で私のOPEN SQL接続の数は500 +になります。参考までに、私はすべてのコマンドの後に私の接続を閉じました。

ここでこのことを最適化するためにここで何をすべきですか?

データテーブルにINSERTデータを格納し、このデータテーブルをAPPLICATION変数に格納する予定です。そして、2分後に、このデータテーブルのデータをデータベースに挿入します。

ここに私の人生を平滑にすることができる他のアイデアはありますか?私は管理スタジオで

SQL Serverの解析をINSERTクエリを実行し、時間をコンパイルするとき

は、より多くの詳細がある。ここ

EDIT

ありがとう: CPU時間= 0ミリ秒、経過時間= 0ms。

SQL Server解析およびコンパイル時間: CPU時間= 0ミリ秒、経過時間= 11ミリ秒。

テーブル 'IndexTable1'。スキャンカウント0、論理読取り2、物理読取り0、先読み読取り0、論理読取り0、論理読取り0、論理読取り0、読込み先読み0である。

表 'IndexTable2'。スキャンカウント0、論理読み取り2、物理読み取り0、先読み読み取り0、LOB論理読み取り0、LOB物理読み取り0、LOB先読み0。

テーブル 'fulltext_index_docidstatus_171147655'。スキャンカウント0、論理読取り11、物理読取り0、読取り先読み0、論理読取り0、論理読取り0、論理読取り0、読込み先読み0である。

表 'MAINTABLE'。走査カウント0、論理的、物理4を読み取り、28を読み取り、先読み0を読み取り、ロブ論理は、ロブの物理0を読み出し、0を読み取る先読みは0

(1行(s)は影響を受けた)

を読み出しロブ

(1行が該当)

SQL Server実行時間: CPU時間= 0ミリ秒、経過時間= 69ミリ秒。

SQL Server解析およびコンパイル時間: CPU時間= 0ミリ秒、経過時間= 0ミリ秒。

SQL Server実行時間: CPU時間= 0ミリ秒、経過時間= 0ミリ秒。

+0

接続プールのサイズはどれくらいですか? – Jordan

+0

潜在的なボトルネックを判断するためには、アプリケーションのベンチマークを行う必要があります。まず、SQL Serverの "計画の説明"をよく理解し、インデックスを確認して、負荷のあるWindowsパフォーマンスモニタを調べて、CPU、RAM、およびディスクI/Oの使用率を確認してください。これらのリンクでも見てください:1)http://msdn.microsoft.com/en-us/library/ff647768.aspx 2)http://msdn.microsoft.com/en-us/library/ms178071.aspx – paulsm4

+0

プロデューサ/コンシューマのパターンを見て、共有コンテキストからの挿入を処理しました。この方法で、接続数を制御してSqlBulkCopyを使用できます。 – Lloyd

答えて

2

専用スレッドを使用して、DBにデータを挿入できます。数秒ごとに大きなチャンクにデータを挿入できる場合は、すべてのinsert文に対して新しい接続を開く必要はありません。このスレッドは、専用ディスパッチャまたはタイマーで実行することができ、スレッド間通信にスレッドセーフキューを使用できます。

1

適切なサーバーを取得することを考えましたか?申し訳ありませんが、ハードウェアが完全に無視される方法では、データベースサーバーが大抵の場合IOバインドされ、ハイエンドを必要とする重いSQL負荷を実行するには本質的に不適切な "標準的なローエンドのホストマシン" IOサブシステム。

+0

私は4GM RAMの高いCPUを搭載した専用サーバを持っています(詳細は覚えていない)サーバー – user867198

+0

、おもちゃ(4GBのRAMはローエンドのマシンです - 平均デスクトップメモリ​​)とおそらく1つの小さなデスクトップレベルのディスク? IOオーバーロードが不思議ですか?データベースサーバーを構築するためのイントロのgbookが適切かもしれません。 CPUがデータベースに無関係であるのは、ディスクが過負荷になり、通常のディスクがSLOW - 150〜200io /秒の操作である場合です。 – TomTom

0

私はこの質問に簡単な答えは分かりません。まず、計画が並行性の問題に陥り、データテーブルなどをロックしようとする可能性があり、それが問題を引き起こす可能性があります。

おおまかに言えば、アプリケーションとデータベースサーバー間の永続的な接続をお勧めします。しかし、一方で、あなたの開いている接続の数は500+以上であるべきではありません。私はそれがあなたに焦点を当てなければならないものだと思います。私はあなたのトランザクションが大きなものだと思うし、それは数秒以上実行されます。それを減らそうとする。私は、ログを書くのと同じように、非常にシンプルで未処理のデータベーステーブルにデータを書き込むことを提案できます。また、定期的に実行されるSQLジョブでは、そのテーブルから読み込んで並列処理します。システムを管理することもできます。システムでは、負荷を検出すると処理が遅れることがあります。

ある時点で類似の挿入クエリが複数ある場合は、上記のステートメントに関係なく、System.Data.SqlClient.SqlBulkCopyクラスを考慮する必要があります。

幸いです。それは、クライアントまたは@サーバサイド@です -

+0

SQL SPにInsertステートメントが1つしかありません。私はそれにSqlBulkCopyコマンドのショットを与えるでしょう。良い代替を見える – user867198

0

、このような質問への答えは

をovercomplicatedすることができるがボトルネックになってWHERE把握するようにしてください。

挿入するために関与インデックスのどのような量とあなたのテーブルの上に任意のホットスポットがある場合 - 単一パーティション自動増分のプライマリキー付きテーブルに対して

非常に一般的ですテーブルの上に実行されたすべての同時のSELECTはありますそれに挿入するとき

これらの点や他の多くの理由を調べて、問題がどこにあるかを調べる必要があります。

あなたの質問に多くの貴重な情報を提供するようにしてください

+0

フロントエンド側で並行してテーブルに対してSELECT文が実行されますが、すべてのSELECTにはNOLOCKオプションがあります。だから私はそれが問題を作成すべきではないと思う – user867198

0

イリヤ・コーガンの答えは、合理的なようだし、それはあなたと同じ静脈です。基本的にバルクインサートをスケジュールベースで実行します。これは、挿入している情報が、ビジネスロジックで新しいリクエストに応答するために使用されていない場合にのみ機能することに注意してください。 レスポンスを発行すると、クライアントは、2番目のリクエストを決定するたびに、サーバの状態の変化がすでに発生しているとみなします。ここでは2つの問題が発生します。1)何らかの理由でクライアントに応答した後後でそのリクエストの結果を挿入できませんでしたか? 2)応答を受け取ったときに、最初の要求の結果が依然として持続しないような方法でクライアントが新しい要求を発行すると、どうなるでしょうか?アプリケーションがこの2番目の要求を処理するためにデータとして使用するもの これは明らかに単純な解決策は他の問題を引き起こす可能性がありますが、Webサービスの設計方法、具体的には要求ごとに永続化されたデータがあれば、

関連する問題