都道府県穴埋めゲーム

ケースA:[SELECT文]-[DB2].[ビュー]-[DB1].[テーブル]

ケースB:[SELECT文]-[DB2].[テーブル]

[テーブル]はどちらも同じ内容です。
ケースAは[DB1]にある[テーブル]を[DB2]の[ビュー]を通して見てます。
ケースBは[DB2]に[DB1]の[テーブル]と同じ物をコピーしています。
同じSELECT結果を表示するSQLで
ケースAとケースBでパフォーマンス的に差が出るのでしょうか?

私が思うのはケースAの場合別DBにあるテーブルをビューを使って
見てる事によって、DBやテーブルへのアクセス権限等の
確認処理でパフォーマンスが低下すると思うのですが
推定実行プランやプロファイラで見てもよく分かりませんでした。

些細な事でも構いませんので、教えてくださいませ。

A 回答 (3件)

オーダリングのログから集計するようなSELECT文をチューニングしたときの経験からいくつか。

(SQL Server2000)

実行時にビューの中身をコピーしてからそのテーブルを見るのだとしたらビューだけでやったほうがいいです。

ビューのリアルタイム性が求められていなくて、定期的にビューの結果をテーブルに放り込んでおいてそこから他のリアルタイム性が求められるテーブルと結合してSELECTを発行するのならパフォーマンスは向上します。

サブクエリ、ビューを多用する場合は、ストアドプロシージャで動的にテーブルを作り、そこにデータを放り込んでインデックスを作成してからSELECTした方が早かったりします。

実行プランやプロファイラを見てもいいですが、本当に複雑な場合はDBの仕組みを考えながら人間が最適化したほうが早いですよ。

肝心の回答ですが、「VIEWを通して得るデータにリアルタイム性があるかどうかで変わってくる」、ということになると思います。
    • good
    • 0

RDBにより、事情が変わってくるかと思いますが..



一般的に、RDBMSは、ビューに対する検索条件を
テーブルの検索条件に織り込むよう努力します。

例えば..
select * from view1 where col1 = 1;

select * from ( select * from table1 where col1=1 );
とする努力をします。

しかし、SQL解析が充分に行えないような、難しいビューや
解析処理(DBMS)がアンポンタンだと、条件の織り込みがしきれず、
良くない実行計画が策定されるケースがあります。

例えば..
select * from view1 where col1 = 1;

select * from ( select * from table1 ) where col1=1;
と扱うイメージ。(全ての結果セットに対し絞り込む)

特に、複雑な加工や複雑な結合を使うと、起こりえます。
(例にあげた表現は、あくまでイメージなので誤解無く)

質問に書かれている権限チェック等のオーバーヘッドは、誤差の範囲なので
パフォーマンスへの影響は皆無に等しいと考えて良いと思います。
    • good
    • 0

RDBMSの種類、実装にもよるとは思いますが、一般的な商用データベースでの場合、VIEWを経由することでのパフォーマンスの低下はほとんどないと思ってよいです。



ご理解されているように、理論上は権限のチェックやSQLのリライトの処理が必要ですが、SQLを処理するという全体の処理量からすれば小さい処理といって良いですし、SQLがリライトされる結果、実行プランも表を直接操作する場合と(多くの場合で)同じものになります。そのため、ほとんどパフォーマンスの違いは測定できないと思います。

個人的な経験でもVIEWを経由することがパフォーマンスの問題になったケースはありません。ですので必要であればVIEWは積極的に使用しても良いでしょう。

ただし、VIEW多用するとどの表を操作しているのか分かりにくくなってしまいますし、VIEWで実現できる機能はRDBMSによって差があるので、使う機能によっては移植性が低下する場合がある事にご注意ください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す


おすすめ情報