8

私は Kimball スタイルの DW (スター モデルのファクトとディメンション - 後から到着するファクトの行や列はなく、タイプ 2 のゆっくりと変化するディメンションの一部としての有効期限を除いて、ディメンションが変化する列はありません) を持っており、行を挿入および更新するための重い毎日の処理 (新しい日付) および月次および日次のレポート プロセス。古いデータを簡単にロールオフできるように、ファクト テーブルは日付ごとに分割されます。

コミットされていないデータが読み取られる可能性があることは理解してWITH(NOLOCK)いますが、ETL プロセスが失敗したりブロックされたりする原因となるロックを作成したくありません。

すべての場合において、DW から読み取るときは、変更されない日付のファクト テーブル (ファクト テーブルは日付によって分割されます) と、リンクされているファクトの属性が変更されないディメンション テーブルから読み取ります。 .

それで - 欠点はありますか?- おそらく実行計画、またはSELECT同じテーブルから並行して実行されるそのような -only クエリの操作で。

4

6 に答える 6

5

これはおそらく必要なものです:

`ALTER DATABASE AdventureWorks SET READ_COMMITTED_SNAPSHOT ON;

ALTER DATABASE AdventureWorks SET ALLOW_SNAPSHOT_ISOLATION ON; `

次に、使用してください

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

あなたのクエリで。BOLによると:

READ COMMITTED の動作は、READ_COMMITTED_SNAPSHOT データベース オプションの設定によって異なります。

READ_COMMITTED_SNAPSHOT が OFF (既定) に設定されている場合、データベース エンジンは共有ロックを使用して、現在のトランザクションが読み取り操作を実行している間、他のトランザクションが行を変更できないようにします。共有ロックは、他のトランザクションが完了するまで、ステートメントが他のトランザクションによって変更された行を読み取ることもブロックします。共有ロックのタイプによって、いつ解放されるかが決まります。行ロックは、次の行が処理される前に解放されます。次のページが読み取られるとページ ロックが解放され、ステートメントが終了するとテーブル ロックが解放されます。

READ_COMMITTED_SNAPSHOT が ON に設定されている場合、データベース エンジンは行のバージョン管理を使用して、ステートメントの開始時に存在していたデータのトランザクション的に一貫性のあるスナップショットを各ステートメントに提示します。ロックは、他のトランザクションによる更新からデータを保護するために使用されません。

この助けを願っています。ラージ

于 2009-06-19T02:58:23.033 に答える
2

DW のデータベース スナップショットを作成し、それからレポートを実行することを検討しましたか?

于 2009-06-19T10:06:09.657 に答える
2

すべて無更新データである限り害はありませんが、メリットもあるとは驚きです。試してみる価値はあると思います。最悪の場合、バッチ挿入の途中で不完全なデータや一貫性のないデータを取得することになりますが、それによって有用なものが無効になるかどうかを判断できます。

于 2009-06-18T20:24:55.497 に答える
1

データベース全体を読み取り専用にすることが可能な場合は、これがより適切なオプションです。すべてのコードを変更しなくても、コミットされていない読み取りパフォーマンスが得られます。

ALTER DATABASE adventureworks SET read_only
于 2009-06-19T00:03:03.590 に答える
1

はい。SQL ははるかに読みにくくなります。NOLOCK ストラテジーを使用する SQL SELECT コマンドでは、NOLOCK ヒントをあちこちに配置する必要があるため、NOLOCK ヒントを見逃すことは避けられません。

分離レベルを設定することで同じことができます

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

最終的に、パフォーマンスが 10% 向上します (記事を調べるのが面倒で申し訳ありませんが、公開されています)。

10% の向上は、可読性を低下させる価値はないと思います。

于 2009-06-18T23:11:23.973 に答える
0

NOLOCK は「ダーティ リード」を実行します (不当に READ UNCOMMITTED は NOLOCK と同じことを行います)。読み取り中にデータベースが更新されている場合、一貫性のないデータが返される危険性があります。唯一のオプションは、ロックを受け入れてブロックするか、ここで説明するSQL 2005 以降で提供される 2 つの新しい分離レベルのいずれかを選択することです。

于 2009-07-16T17:10:09.957 に答える