データウェアハウスシナリオには、WITH(NOLOCK)を使用することの欠点があります
-
06-07-2019 - |
質問
KimballスタイルのDW(スターモデルのファクトとディメンション-遅刻ファクトの行または列はなく、タイプ2の緩やかに変化するディメンションの一部としての有効期限を除き、列のディメンションは変更されません)行の更新(新しい日付)および月次および日次の報告プロセス。ファクトテーブルは、古いデータを簡単にロールオフできるように日付でパーティション分割されています。
WITH(NOLOCK)
はコミットされていないデータを読み取る可能性があることを理解していますが、ETLプロセスが失敗したりブロックしたりするロックを作成することも望んでいません。
すべての場合において、DWから読み取るときは、変更されない日付のファクトテーブル(ファクトテーブルは日付でパーティション化されています)およびファクトの属性が変更されないディメンションテーブルから読み取られますにリンクされています。
それで、欠点はありますか? -おそらく実行計画またはそのような SELECT
の操作で-同じテーブルで並行して実行されるクエリのみ。
解決
更新されていないデータである限り害はありませんが、どちらにも多くのメリットがある場合は驚かれることでしょう。試してみる価値はあると思います。最悪の事態は、バッチ挿入の最中に不完全なデータや一貫性のないデータを取得することですが、有用なものが無効になるかどうかを判断できます。
他のヒント
これはおそらく必要なものです:
`ALTER DATABASE AdventureWorks SET READ_COMMITTED_SNAPSHOT ON;
ALTER DATABASE AdventureWorks SET ALLOW_SNAPSHOT_ISOLATION ON; `
次に、先に進んで使用します
トランザクション分離レベルの読み取りをコミットするように設定
。 BOLによると:
READ COMMITTEDの動作は、READ_COMMITTED_SNAPSHOTデータベースオプションの設定によって異なります。
READ_COMMITTED_SNAPSHOTがOFF(デフォルト)に設定されている場合、データベースエンジンは共有ロックを使用して、現在のトランザクションが読み取り操作を実行している間、他のトランザクションが行を変更できないようにします。また、共有ロックは、他のトランザクションが完了するまで、他のトランザクションによって変更された行の読み取りをステートメントがブロックします。共有ロックタイプは、いつ解放されるかを決定します。行ロックは、次の行が処理される前に解放されます。次のページが読み取られるとページロックが解除され、ステートメントが終了するとテーブルロックが解除されます。
READ_COMMITTED_SNAPSHOTがONに設定されている場合、データベースエンジンは行のバージョン管理を使用して、各ステートメントを、ステートメントの開始時に存在したトランザクションの一貫性のあるデータのスナップショットで提示します。ロックは、他のトランザクションによる更新からデータを保護するためには使用されません。
このヘルプをお待ちしています。 Raj
DWのデータベーススナップショットの作成を検討し、レポートを実行しますか?
はい。 SQLの可読性ははるかに低くなります。 NOLOCKストラテジーを使用するSQL SELECTコマンドは、それをあちこちに配置する必要があるため、必然的にNOLOCKのヒントを見逃すことになります。
最終的には、パフォーマンスが10%向上します(私は怠けすぎで記事を参照できませんが、それはそこにあります)
10%の利益は読みやすさを低下させる価値はないと思います。
データベース全体を読み取り専用にすることができる場合、これはより良いオプションです。すべてのコードを変更することなく、読み取り専用のパフォーマンスが得られます。
ALTER DATABASE adventureworks SET read_only
NOLOCKは‘ダーティリード’を実行します(誤ってREAD UNCOMMITTEDはNOLOCKと同じことを行います)。読み取り中にデータベースが更新されると、一貫性のないデータが返される危険があります。唯一のオプションは、ロックを受け入れてブロックするか、SQL 2005以降で提供される2つの新しい分離レベルのいずれかを選択することですここで議論。