なぜ人々はビューを通じて更新しないようにアドバイスされています


8

大学時代は、ビューを介してテーブルを更新しないように頭を悩ませられました。また、私が職場に入ったとき、ビューを通じてデータベースを更新しないように言われました。

これを行うと、パフォーマンスに大きな影響がありますか?または、これは上級開発者/ DBAがジュニア担当者に誤った結合で無意識のうちに大混乱を引き起こす可能性があるために、これを行わないように指示するケースです。

編集
私はMSSQL 2000-2008を使用しています(クライアントの詳細によって異なります)


どのDBMSを使用していますか?
a_horse_with_no_name 2011

@a_horse_with_no_name DBMSを示すために更新されました。答えがすべてのDBMSでかなり一般的であることを期待していました。私は世間知らずでしたか?
Tim Sparg

自然に更新可能なビュー、またはINSTEAD OFトリガーを作成する必要があるビューについて話しているのですか?ちなみにこのアドバイスは聞いたことがありません。
マーティン・スミス

@TimSparg:ビューを更新可能にする方法によって異なります。instead ofトリガーが使用されている場合、あいまいさはなく、トリガーを使用しない理由はわかりません。しかし、私はSQL Serverにあまり慣れていないため、トリガーなしでビューを使用することについてコメントすることはできません。
a_horse_with_no_name 2011

@Martin Smith私は自然に更新可能なビューについて話している。落とし穴やパフォーマンスの問題があると漠然と言われましたが、ビューを介して更新しないようにしっかりと指示されていた職場では、これが強化されました。上級の開発者/ DBAは、ビュー(IE内部結合と外部結合)による更新について注意深く説明するのを好まなかったため、それはまさにそれだと思い始めています
Tim Sparg

回答:


10

INSTEAD OFトリガーを使用せずにビューを更新可能にするには、「SQL Serverは、ビュー定義から1つのベーステーブルへの変更を明確に追跡できる必要があります。」

SQL Serverは影響を受けるベーステーブルのクエリプランを生成するだけなので、これらのビューを更新してもパフォーマンス上の問題はありません。考えられる欠点の1つは、難読化のレイヤーを追加することです。そのため、ビューをセキュリティレイヤーとして使用しない限り、ベーステーブルを直接更新するコードを記述する方が明確です。

ビューに1対多が含まれていてJOIN、「1」側を「多」側の値で更新する場合、最終的にどの結果になるかは不確定ですが、SQL Serverの独自のUPDATE ... FROM構文にも同じことが当てはまります。MERGEこの可能な問題を回避するには、またはスカラー相関サブクエリを使用する必要があります。

更新可能ではなく、INSTEAD OFトリガーを必要とするビューの場合、insertedおよびdeleted疑似テーブルをベーステーブルから生成する必要があるため、可能であればベーステーブルを直接更新する方が効率的である可能性があるため、パフォーマンスに影響があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.