ケースA:[SELECT文]-[DB2].[ビュー]-[DB1].[テーブル]
ケースB:[SELECT文]-[DB2].[テーブル]
[テーブル]はどちらも同じ内容です。
ケースAは[DB1]にある[テーブル]を[DB2]の[ビュー]を通して見てます。
ケースBは[DB2]に[DB1]の[テーブル]と同じ物をコピーしています。
同じSELECT結果を表示するSQLで
ケースAとケースBでパフォーマンス的に差が出るのでしょうか?
私が思うのはケースAの場合別DBにあるテーブルをビューを使って
見てる事によって、DBやテーブルへのアクセス権限等の
確認処理でパフォーマンスが低下すると思うのですが
推定実行プランやプロファイラで見てもよく分かりませんでした。
些細な事でも構いませんので、教えてくださいませ。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
オーダリングのログから集計するようなSELECT文をチューニングしたときの経験からいくつか。
(SQL Server2000)実行時にビューの中身をコピーしてからそのテーブルを見るのだとしたらビューだけでやったほうがいいです。
ビューのリアルタイム性が求められていなくて、定期的にビューの結果をテーブルに放り込んでおいてそこから他のリアルタイム性が求められるテーブルと結合してSELECTを発行するのならパフォーマンスは向上します。
サブクエリ、ビューを多用する場合は、ストアドプロシージャで動的にテーブルを作り、そこにデータを放り込んでインデックスを作成してからSELECTした方が早かったりします。
実行プランやプロファイラを見てもいいですが、本当に複雑な場合はDBの仕組みを考えながら人間が最適化したほうが早いですよ。
肝心の回答ですが、「VIEWを通して得るデータにリアルタイム性があるかどうかで変わってくる」、ということになると思います。
No.2
- 回答日時:
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;
と扱うイメージ。(全ての結果セットに対し絞り込む)
特に、複雑な加工や複雑な結合を使うと、起こりえます。
(例にあげた表現は、あくまでイメージなので誤解無く)
質問に書かれている権限チェック等のオーバーヘッドは、誤差の範囲なので
パフォーマンスへの影響は皆無に等しいと考えて良いと思います。
No.1
- 回答日時:
RDBMSの種類、実装にもよるとは思いますが、一般的な商用データベースでの場合、VIEWを経由することでのパフォーマンスの低下はほとんどないと思ってよいです。
ご理解されているように、理論上は権限のチェックやSQLのリライトの処理が必要ですが、SQLを処理するという全体の処理量からすれば小さい処理といって良いですし、SQLがリライトされる結果、実行プランも表を直接操作する場合と(多くの場合で)同じものになります。そのため、ほとんどパフォーマンスの違いは測定できないと思います。
個人的な経験でもVIEWを経由することがパフォーマンスの問題になったケースはありません。ですので必要であればVIEWは積極的に使用しても良いでしょう。
ただし、VIEW多用するとどの表を操作しているのか分かりにくくなってしまいますし、VIEWで実現できる機能はRDBMSによって差があるので、使う機能によっては移植性が低下する場合がある事にご注意ください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ビューで引数を使いたい
-
ACCESS 一番最新の日付の金額...
-
IFで条件を分岐させてのINSERT...
-
(初心者です)パフォーマンス...
-
SQLの書き方
-
SQL文を教えて下さい
-
Accessで在庫管理を
-
「マスタ」と「テーブル」の違...
-
accessのエクスポートエラーに...
-
エクセルでテーブルの最終行が...
-
コンボボックスで入力したもの...
-
PLSQLの識別子エラー
-
ACCESSのSQLで、NULLかNULLでな...
-
3つ以上のテーブルをUNIONする...
-
ACCESSのBookmarkプロパティの...
-
SQLServerで同一条件レコードの...
-
SQL
-
Accessにインポートしたら並び...
-
SI Object Browserのテーブルス...
-
UPDATE文で発生するデッドロッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESS 一番最新の日付の金額...
-
ビューで引数を使いたい
-
IFで条件を分岐させてのINSERT...
-
SQL 件数取得を速くしたい
-
複数のテーブルから同じ条件で...
-
Accessで在庫管理を
-
select into句のトランザクショ...
-
INSERT文でサブクエリ
-
SQL文を教えて下さい
-
Access関数について クエリで空...
-
DB2 業種毎に連番をつけたいの...
-
Insert Into Select での重複に...
-
ACCESSの作り方
-
リレーションシップ 全データを...
-
空のテーブルの判別
-
SQLで○○の値以外を持っているレ...
-
SQL文の作成でなやんでいます。
-
二つの表の項目を比較して値を...
-
(初心者です)パフォーマンス...
-
大学でSQLの授業があるのですが...
おすすめ情報