![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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も見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
Viewにインデックスは張れますか?
Oracle
-
ビューで引数を使いたい
SQL Server
-
VIEWの元のテーブルのindexって有効なのでしょうか?
MySQL
-
-
4
ビューのソートについて
SQL Server
-
5
ビュー定義をプログラムで動的に扱う方法
SQL Server
-
6
SELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか
MySQL
-
7
テーブルに主キーを作らないデメリットは?
その他(Microsoft Office)
-
8
異なるDB間でのJOINやVIEWについて
その他(データベース)
-
9
GROUP BYを行った後に結合したい。
Oracle
-
10
テーブルの存在チェックについて
Oracle
-
11
MAX関数を使ってからLEFT JOINしたいのですが・・
PHP
-
12
SQLserverのIF文について
SQL Server
-
13
数百万件レコードのdelete
SQL Server
-
14
2つのテーブルから条件に一致しないデータ抽出
SQL Server
-
15
ORA-01858: 数値を指定する箇所に数値以外の文字が指定されています
Java
-
16
コマンドプロンプトの「%1」と「%~1」の違いがわからない
その他(プログラミング・Web制作)
-
17
特定条件でWHERE句の条件を変更したい
SQL Server
-
18
SQLServerで文字列の末尾からある位置で取出
SQL Server
-
19
外部キーだけのテーブル(主キーがない?)
その他(データベース)
-
20
文字数が多い口座名義
その他(家計・生活費)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#1062 - '0' は索引 'PRIMARY' ...
-
日本の全市区町村を人口密度が...
-
下の画像はSQLの4大命令の性質...
-
データベースの複製の仕方(mysql)
-
SQLでカラムを追加し、条件に合...
-
select *, `人口(男)`AND`人口(...
-
テーブル名が可変の場合のクエ...
-
SQLについて教えて下さい。 SEL...
-
テーブル作成です。どこかのス...
-
MAMPで80ポートが使用されている...
-
同一のユーザー、同一商品のと...
-
SQLです。こんな感じですか?あ...
-
書籍の内容はまともでしょうか?
-
SQLで日付別のIDを生成するには
-
mysql>status で
-
下記の問合せを行うクエリを、P...
-
下記の問合せを行うクエリを、P...
-
エラー 1068 (42000): 複数の主...
-
MySQLのテーブル作成でハイフン...
-
「重複を間引いた数」をcountし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VIEWに対してWHERE句をつける
-
空白文字を含む文字列データの検索
-
コマンドプロンプト 複数の実...
-
JOIN使ってないのに、JOIN操作...
-
Mysql 同一テーブルの複数「別...
-
count()の結果を別の計算で使う...
-
MySQL + PHP での自動採番
-
Null値が入れられない
-
NULLを含む列の足し算
-
MySQLの特定のカラムの内容を全...
-
nullと同じく空白をCountしない...
-
SQL任意に並び替えをしたい
-
SQLでLIMIT句を入れるとエラー...
-
SQL文を入力したらエラー
-
テーブル作成時に、「`id` int(...
-
MySQLで関連したデータを横に並...
-
後でemailに追加でPRIMARY KEY...
-
sqlの中で、 例えば条件句で AN...
-
MySQLで項目の反復定義(COBOL...
-
3つのテーブルから、データが...
おすすめ情報