例えば、
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'
としたほうがはるかに早い。
お礼
回答、誠にありがとうございます。 なるほど、確かにそのような複数のミドルウェアで動かす場合、大変発揮するVIEWですね。一つ勉強になりました。