
ケース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で質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- Oracle SQL update方法 2 2022/06/22 14:07
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- SQL Server DBのテーブルの設計ができず困っています。 2 2023/06/29 16:43
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- MySQL PHP 画像のアップロード Qiita 2 2022/11/28 04:44
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
IFで条件を分岐させてのINSERT...
-
ACCESS 一番最新の日付の金額...
-
クエリでこのテーブルのデータ...
-
ビューで引数を使いたい
-
Insert Into Select での重複に...
-
AccseeのSQL文について教えてく...
-
SQLで○○の値以外を持っているレ...
-
SQL 件数取得を速くしたい
-
空のテーブルの判別
-
【SQL】SELECT 文で外部のレコ...
-
DB2 業種毎に連番をつけたいの...
-
大学でSQLの授業があるのですが...
-
SQLの書き方
-
ACCESS2007 フォーム 「バリア...
-
SELECT文でのデッドロックに対...
-
「マスタ」と「テーブル」の違...
-
sqlserverで集計結果をUPDATEし...
-
重複するキーから一番古い年月...
-
Access VBA [リモートサーバー...
-
オラクルではできるのにSQLSERV...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ビューで引数を使いたい
-
ACCESS 一番最新の日付の金額...
-
IFで条件を分岐させてのINSERT...
-
Access関数について クエリで空...
-
Insert Into Select での重複に...
-
SQLで○○の値以外を持っているレ...
-
select into句のトランザクショ...
-
空のテーブルの判別
-
SQL 件数取得を速くしたい
-
別のテーブルの値を抽出条件と...
-
DB2 業種毎に連番をつけたいの...
-
大学でSQLの授業があるのですが...
-
リレーションシップ 全データを...
-
Sql文のUpdateと副問い合わせで...
-
複数のテーブルから同じ条件で...
-
Access2000 選択クエリで最新...
-
Accessで在庫管理を
-
SQLについて質問です。 テーブ...
-
SQLの書き方
-
2つのテーブルを結合して合計(...
おすすめ情報