
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
例えば、
create view vw1 as select * from table1 where KeyCol2 = '1'
select * from vw1 where keyCol1 = 'X'
order by keyCol2
なんてすると、
select * from table1 where keyCol1 = 'X' and Keycol2 = '1'
order by keyCol3
はインデックス(KeyCol1,KeyCol2,KeyCol3)を使えるのに、
Viewを使ったほうが、インデックスを使えない
(KeyCol2が'1'を抽出してからkeyCol1='X'を洗い出すため)
なんてことが起きるかもしれません。
(この例は、SQLを解析した結果で実行計画が同じ処理となるかもしれませんが。)
なお、
SQLでVIEWを作成し、そのVIEWに対してSELECT文を書くときに、そのVIEWに対してWHERE句をつけるのは、パフォーマンスを必ず下げることになるのでしょうか?
は必ずしも下げることになるとは限りません。
where句でインデッックスを使えない場合、
Create view vw2
select * from table1 where NotIndexCol1 = 'A'
として、
select * from vw2 where NotIndexCol2 < 15
としようが、
select * from vw2 where NotIndexCol1 = 'A' and NotIndexCol2 < 15
としようがあまり変わらないはずです。
(SQL解析時間が少し早くなるかもしれませんが、体感速度の差というレベルではないはず。)
まあ、そもそも、View でwhere 句を書いて、Viewを使ったSelect句でも、where 句を書くのは
お薦めしません。(Viewが副問い合わせ扱いされる危険性があるため)
create view vw1
select * from table1 where NotIndexCol1 = '1'
して、
selcet vw1 where IndexCol1 = 12
なんてしたときに、table1 が10万件合って、IndexCol1 = 12 が10件しかなかったら
いったん、
select * from table1 where NotIndexCol1 = '1'
で数万件のワークを作って、その中からIndexCol1 = 12を探すという動きになったら
きわめて遅いだけです。(SQL解析能力に期待しましょう・・・というわけにはいかないので。)
こうなったら、
select * from table1 where IndexCol1 = 12 and NotIndexCol1 = '1'
としたほうがはるかに早い。
No.3
- 回答日時:
>確認で申し訳ありませんが、結局、VIEWに対してWHERE句をつけても、相当複雑や件数が多い(10万件以上くらい)VIEWでない限り、パフォーマンスが落ちことは早々ないと考えてよろしいでしょうか?よろしくお願いいたします。
そう考えて良いと思います。
No.2
- 回答日時:
あくまでも個人的な意見ですが。
VIEWを多用すると、後でロジックを解析する場合に、解析が面倒になるので、あまり使わない方が良いと考えます。ただし、便利な場合もあります、私の作っている開発支援ツールは7種類のRDBMSで動くようになっていますが、テーブル一覧等を検索したい場合は、RDBMS毎にテーブル構造が大きく異なっているので、VIEWを使って同じ構造に見せかける事でツール側のSQLを同じに出来るようにしています。回答、誠にありがとうございます。
なるほど、確かにそのような複数のミドルウェアで動かす場合、大変発揮するVIEWですね。一つ勉強になりました。
No.1
- 回答日時:
効率を気にする時には、まず、ちゃんと動く、且つ、読みやすくメンテナンスしやすいコードを書く事が先決です。
プログラミングしてデバッグして運用する。運用しているうちに必ず手直しや改造が発生し、その時に再び、その書いたコードを読んで理解してから修正し、またデバッグする。
このライフサイクル全体を見れば、読むに堪えない、複雑なSQLで、体感できないくらいの実行速度のアップを図るのと、使える物は何でも使って、とにかく見やすいSQLを組むのと、どちらが「総合的な」効率が良いかというと、間違いなく後者です。
そぉ言う意味では、Viewは積極的に使う価値のあるツールだと思います。
(近年、オプティマイザの性能もずいぶんよくなりました。DBMSは必要とあらば、自分で勝手にViewを展開してでも、実行順序をコントロールします。)
ただし、Viewを使用したSQLを作った時に、どうしても、実行速度が実用にならないと判断された時は別です。
まぁ、たいていは、インデックスや、下手するとテーブル設計がまずいことが速度低下の原因であることが多いですが、Viewが犯人だと確定したら、その時に、初めて、Viewを使わないでSQLを構築することを考えるのが筋ですね。
こうすれば、Viewが必ず効率を下げるかとか言う議論はある意味、無意味です。
いわゆる「効率化」とか「最適化」というのは細心の注意と測定結果をもとに、課題に応じて計画的にやるもので、原則に従って機械的に適用するものではありません。
回答、誠にありがとうございます。
おっしゃるとおり、確かに体感速度を感じない速度向上を気にするより、後で見た時に分かり良いSQLであることが大変重要であることは、私も経験上ございます。
積極的に使うことについては、個人的な考えにより、様々なご意見はございますが、いろいろなケースで試して行きたいと思います。
確認で申し訳ありませんが、結局、VIEWに対してWHERE句をつけても、相当複雑や件数が多い(10万件以上くらい)VIEWでない限り、パフォーマンスが落ちことは早々ないと考えてよろしいでしょうか?よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL SQLについて教えて下さい。 SELECT分で、あるカラムにある日付の 半年先のデータを取って来たい 3 2022/12/07 22:28
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 日本の全市区町村を人口密度が低 1 2023/06/18 19:51
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
このQ&Aを見た人はこんなQ&Aも見ています
-
ビューで引数を使いたい
SQL Server
-
Viewにインデックスは張れますか?
Oracle
-
ビュー定義をプログラムで動的に扱う方法
SQL Server
-
-
4
VIEWの元のテーブルのindexって有効なのでしょうか?
MySQL
-
5
テーブルに主キーを作らないデメリットは?
その他(Microsoft Office)
-
6
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
7
年度の何年前
日本語
-
8
GROUP BYを行った後に結合したい。
Oracle
-
9
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
10
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
11
ビューのソートについて
SQL Server
-
12
ビューにインデックスを設定できませんか?
SQL Server
-
13
FROM の中で CASE を使えるでしょうか
SQL Server
-
14
Chr(13)とChr(10)の違いは?
PowerPoint(パワーポイント)
-
15
SQLPLUSで結果を画面に表示しない
Oracle
-
16
SQLServerでViewの参照・・・
SQL Server
-
17
Transact-SQLでストアードプロシージャ・関数内でのみ有効なモジュールは作れますか?
SQL Server
-
18
不明なコマンドです(FROM")。行の残りは無視されました。 のエラー"
Oracle
-
19
visual studio でインデントを自動的に揃えるショートカットキー
その他(プログラミング・Web制作)
-
20
エクセルファイルに _x000D_ という文字列が挿入されるトラブルと解決法
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラー 1068 (42000): 複数の主...
-
mysqlがインストールされている...
-
#1062 - '0' は索引 'PRIMARY' ...
-
下記の問合せを行うクエリを、P...
-
【初歩】ラジオボタンをつかっ...
-
下記の問合せを行うクエリを、 ...
-
下記の問合せを行うクエリを、P...
-
SQLでカラムを追加し、条件に合...
-
下記の問合せを行うクエリを、P...
-
下記の問合せを行うクエリを、P...
-
テーブル名が可変の場合のクエ...
-
MySQLのテーブル作成でハイフン...
-
LIMIT で条件を満たしているの...
-
MAMP 99ドル約1.6万円 高い...
-
うまくいきません教えてくださ...
-
select *, `人口(男)`AND`人口(...
-
下記の問合せを行うクエリを、P...
-
何にかが違うから エラーなんで...
-
同一日に複数レコードがある場...
-
SQLです教えてくださいお願いし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VIEWに対してWHERE句をつける
-
空白文字を含む文字列データの検索
-
JOIN使ってないのに、JOIN操作...
-
複数のカラムを対象にしたプラ...
-
コマンドプロンプト 複数の実...
-
MySQL + PHP での自動採番
-
コマンドプロンプト 実行結果...
-
Mysql 同一テーブルの複数「別...
-
mysql insertのselect
-
Null値が入れられない
-
nullと同じく空白をCountしない...
-
NULLを含む列の足し算
-
SQLでLIMIT句を入れるとエラー...
-
MySQLの特定のカラムの内容を全...
-
SQL任意に並び替えをしたい
-
異なるデータベース間のリレー...
-
SQL文を入力したらエラー
-
MySQLでのテーブル名取得に制限...
-
SELECT文の二段重ね
-
whereについて
おすすめ情報