2009-06-18 9 views
7

私はKimballスタイルのDWを持っています(スターモデルのファクトとディメンション - 遅れて到着するファクトの行や列はありません。タイプ2の一部であり、ゆっくりと変化するディメンション)を使用して、行(新しい日付に)と月間および日次のレポート処理を挿入および更新するための大量の毎日処理を実行します。ファクト表は、古いデータの簡単なロールオフのための日付によってパーティション化されています。データウェアハウスのシナリオでは、WITH(NOLOCK)を使用することには不利益があります

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

すべてのケースで、DWから読んでいるときは、変更されない日付(ファクトテーブルは日付でパーティション化されています)とファクトテーブルから読み取っています。彼らはにリンクされています。

だから何か不利な点はありますか? - おそらく実行計画やそのような操作の場合は、同じテーブルから並列に実行されるクエリだけです。

+0

と関連しています。 http://stackoverflow.com/questions/20047/diagnosing-deadlocks-in-sql-server-2005 –

答えて

2

すべて更新されていないデータであれば害はありませんが、多くのメリットがある場合は驚いています。私はそれが試してみる価値があると言いたい。最悪の場合、バッチインサートの途中で不完全なデータや不整合なデータが得られますが、それが有用なものを無効にするかどうかを判断できます。

+0

私たちが読んでいる事実の行は変更されず、次元の行は常に有効ですが、期限が切れて新しい新しい事実のための次元が生まれました。 –

+0

私はまったくまっすぐに思えます。私には2つの質問しかありません。 1.この変更を行わずに実行する方法に問題があるかどうか(つまり、時期尚早の最適化である可能性があります)。 2.これらはすべて読み取り専用のクエリであり、分離レベルを緩和しています。あなたが想像していることは、何か悪いことです(あなたがappendとfacting versioningに重点を置いて明らかに緩和していることです)。 – dkretz

+0

私はETLを管理していませんが、私はすべての報告を担当しています。私はsp_whoへのアクセスを許可されていないので、DBAが私をブロックしていると不平を言う前に、私の(重要な)処理が毎日と毎月の負荷を妨げないことを積極的に確認する必要があります。 –

1

はい。あなたのSQLははるかに読みにくくなります。 NOLOCK戦略を使用するSQL SELECTコマンドは、すべての場所に配置する必要があるため、必然的にいくつかのNOLOCKヒントが欠落します。最後に

You can get the same thing by setting the isolation level

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

あなたは、10%の性能向上(申し訳ありませんが、私はそれについての記事を検索すぎ怠け者だけど、それはそこだ)

を取得し、私は」 10%の利益は可読性を下げる価値がないと言います。

+0

+1は隔離レベルを設定しますが、「nolockを使用する」は何もないよりも優れています。それは、それが動くかどうかと同じくらい10%ものではありません。 –

+0

私はそれを検討します。接続には他の操作があります(つまり、私のプロセス構成と状態データ、実際の/星型のモデリングされたデータではありません)。私は必ずしもそのように動作する必要はありません。この時点で、DWデータベース内のスターモデルをラップして平坦化するビューに、WITH(NOLOCK)が集中しています。 –

1

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

ALTER DATABASE adventureworks SET read_only 
+0

DWデータベースはすでに自分のユーザーには読み取り専用ですが、ファクト(および必要に応じてディメンション)に新しいデータをロードするETLプロセスに対して書き込み可能である必要があります。私のデータベースは私のプロセスの手順と構成を保持しています。 –

+0

私はそれがdbがユーザーではなく読み込み専用であれば動作すると思います。おそらく、データベースをETLの一部としてread_onlyに変更することを検討してください。 –

+0

読み取り専用のファイルグループですか? –

5

これは、あなたがおそらく必要なものです:

`のALTER DATABASE AdventureWorksの SET READ_COMMITTED_SNAPSHOT ON;

変更データベースAdventureWorks SET ALLOW_SNAPSHOT_ISOLATION ON; `

そして、先に行くと、あなたのクエリで

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

を使用しています。 BOLによると:

COMMITTED READの振る舞いは、READ_COMMITTED_SNAPSHOTデータベースオプションの設定に依存:

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

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

このヘルプが必要です。 Raj

+0

私はそれを検討します。接続には他の操作があります(つまり、私のプロセス構成と状態データ、実際の/星型のモデリングされたデータではありません)。私は必ずしもそのように動作する必要はありません。 –

2

DWのDATABASE SNAPSHOTを作成してレポートをオフにしたことがありますか?

+0

いいえ、これは実際には可能ではありません。なぜなら、私たちは数TBのデータを扱っているからです。 DWはこの目的のために設計されているため、ファクトテーブルは日付によってパーティション化されています。 –

+0

しかし、データベーススナップショットは、コピーオンライトセマンティクスを持つスパースファイルです。必要なのは、ディスク上のスペースを確保することだけです。実際のI/O操作は、元のデータベースで書き込みが発生した場合にのみ発生します。 –

0

NOLOCKは「ダーティリード」を実行します(偶然READ UNCOMMITTEDはNOLOCKと同じことを行います)。あなたが読んでいるときにデータベースが更新されていると、矛盾したデータが戻ってくる危険性があります。唯一のオプションは、ロックを受け入れてブロックするか、SQL 2005以降で提供される2つの新しい分離レベルの1つを選択することです。discussed here

+0

データの挿入や更新はできません。唯一の変更は、処理が完了するまで読まない将来の日付になります。 –

+0

NOLOCKは正しい解決策です。 –

関連する問題