5

スナップショット分離機能は、大量のサイトでリーダーがライターをロックアウトする問題を解決するのに役立ちます。これは、SqlServer で tempdb を使用して行をバージョン管理することによって行われます。

私の質問は、このスナップショット分離機能を正しく実装することです.SqlServerで次を実行するだけの問題ですか.

ALTER DATABASE MyDatabase
SET ALLOW_SNAPSHOT_ISOLATION ON

ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON

次のように、TransactionScope を含むコードも作成する必要がありますか?

using (new TransactionScope(TransactionScopeOption.Required, 
    new TransactionOptions { IsolationLevel = IsolationLevel.SnapShot}))

最後に、Brent は、この記事の同時実行の隠れたコストのセクションで懸念を指摘しました。この記事では、tempdb で行をバージョン管理する際に、tempdb はスペースが不足する可能性があり、バージョン管理された行を検索する必要があるため、パフォーマンスの問題が発生する可能性があると述べています。私の質問は、このサイトがスナップショット分離を使用していることは知っていますが、他の誰かが大規模なサイトでこの機能を使用していることを知っています。パフォーマンスについてどう思いますか?

ありがとう、レイ。

4

1 に答える 1

0

https://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.110).aspxに記載されているように、「READ_COMMITTED_SNAPSHOT オプションがオフの場合、バージョン管理された行にアクセスするには、各セッションのスナップショット分離レベルを明示的に設定する必要があります。」2 番目の ALTER DATABASE コマンドは READ_COMMITTED_SNAPSHOT を ON に設定するため、コードでその TransactionScope を指定する必要はありません。

パフォーマンス コインには 2 つの側面があります。パフォーマンスについて意見を求めるときはいつでも、「十分」対「不十分」です。「供給」が圧倒的であるか、「需要」が圧倒的であるかのいずれかです。 tempdb によって使用されるパフォーマンスとスペースに対して、「需要」は tempdb への書き込みが発生する速度に関係する可能性があります。供給側では、さまざまなハードウェア (単一スピンドル 5400 RPM ディスクから SSD のアレイまで) を使用できます。需要側では、これは SQL Server の問題ではなく (データベース設計を適切に正規化できないことが要因になる可能性があります)、クライアント コードの問題と同じくらい重要です。

私の SQL Server では、クライアントが約 50 書き込み/分と 2000 バッチ/分を同時に要求していることがわかります。書き込みは通常、OTLP/短い側にあります。SQL Server ごとに 1 TB のデータベースと 30 GB の tempdb があります。通常、すべてのデータベースは第 3 正規形に正規化されます。すべてのデータベースは SSD で実行されています。tempdb ディスクの IO スループット容量を超える心配はありません。その結果、システムでスナップショット分離を有効にすることについて心配することはありませんでした。しかし、スナップショット分離を有効にしようとしたが、すぐに放棄された他のシステムを見てきました。

あなたのシステムのエクスペリエンスは、他の回答者のシステムとは桁違いに異なる可能性があります。tempdb の他の使用法 (並べ替えを含む) の再生とともに、システムの書き込みのプロファイリング/信頼性の高い再生を試みる必要があります。 tempdb サイズ)。負荷テストは後付けであってはなりません:)。また、 tempdbディスクの IO スループット キャパシティのベンチマークも行う必要があります。

于 2015-08-11T23:33:57.463 に答える