2017-04-27 9 views
1

Teradata DWHからデータを取得するアプリケーションを開発しています。 DWHの開発者は、すべてのSELECTクエリの前にLOCK ROW FOR ACCESSを使用して、そのテーブルへの書き込みの遅延を避けるように指示しました。Teradata - ライターをロックしないで選択するには? (アクセス用のロッキング・ローとアクセス用のロッキング・テーブル)

MS SQL ServerのWITH(NOLOCK)ヒントをよく知っているので、LOCK ROW FOR ACCESSと同等です。しかし、INSERTまたはUPDATE文がLOCK ROW FOR ACCESSを使用して許可されていません(これが失敗した理由、それはテーブル(複数可)文は、から選択するために適用する必要があるため、それは、私にとっては明らかではないが、ないものに私が挿入):

-- this works 
LOCK ROW FOR ACCESS 
SELECT Cols 
FROM Table 

-- this does not work 
LOCK ROW FOR ACCESS 
INSERT INTO SomeVolatile 
SELECT Cols 
FROM PersistentTable 

私はLOCKING TABLE ... FOR ACCESSが使用できることを見ましたが、それが私の必要性に合っているかどうかは不明です(NOLOCK相当 - 書き込みをブロックしないでください)。

質問:INSERTステートメント内で選択すると、書き込みの遅延を最小限に抑えるためにどのようなヒントを使用しますか?

答えて

3

LOCK ROW FOR ACCESSをINSERT-SELECT文で使用することはできません。 INSERTステートメントは、書込み先のテーブルにWRITEロックを設定し、選択元のテーブルにREADロックを設定します。それはあなたがINSERT-SELECTでLOCK ROW FOR ACCESSを得ることが絶対不可欠だ場合

、その後のようなビューを作成することを検討:

CREATE VIEW tmpView_PersistentTable AS 
LOCK ROW FOR ACCESS 
SELECT Cols FROM PersistentTable; 

そしてビューから、SELECT、INSERT、あなたを実行します。

INSERT INTO SomeVolatile 
SELECT Cols FROM tmpView_PersistentTable; 
+0

ビューを使用するとよいアドバイスです。残念ながら、私は変更を行うことを許可していませんが、MDW開発者に、アクセスしているテーブルを「アクセス用のロック行」ビューにラップするよう依頼することができます。 – Alexei

+0

@Alexei:Teradata環境では、ほとんどのエンド・ユーザーはLOCK ROW ACCESSを含む1:1ビューしかアクセスできないため、これらのビューはすでに存在している可能性があります。さらに、ソーステーブルのPIを使用して選択しない限り、LOCK ROW/TABLEの違いはありません。 Btw、MDW =ドイツの大手小売業者ですか? – dnoeth

+0

@dnoeth - あ、申し訳ありません。 MDW =マスターデータウェアハウス。私はそれがいくつかの地元企業の略語として使われているのを見ましたが、それは知られている頭字語だと思っていましたが、あなたとGoogleは私を間違っていました。そして、はい、それはDEのデータウェアハウスの大手小売業者です。 – Alexei

1

直接の回答ではありませんが、これはユーザー/アプリケーション/などがビューを通してデータにアクセスする理由の1つであると私は理解しています。ビューのロックfor accessは、挿入/更新を防止しません。テーブルから選択すると、読み込みロックが使用され、挿入/更新が防止されます。

欠点はアクセスロックであり、ダーティリードの可能性があります。

関連する問題