View-ovi su mac sa dve ostrice. Sa jedne strane ti olaksaju zivot jer ti omogucavaju da reorganizujes podatke u upotrebljivu formu i onda lakse sa njima baratas. Problem sa druge strane je u tome sto su staticni. Na primer, ako imamo view:
Code:
CREATE VIEW ListaStranaka AS
SELECT
s.ID_Stranka, s.Naziv, ts.TipStranke
FROM
Stranke AS s
LEFT JOIN
TipoviStranaka AS ts ON ts.ID_TipStranke = s.ID_TipStranke
Ako ti trebaju npr. samo kupci (ID_TipStranke = 2), ne mozes napisati
Code:
SELECT * FROM ListaStranaka WHERE ID_TipStranke = 2
...jer se polje ID_TipStranke ne nalazi u view-u. Ali to se da resiti ako dodamo jos jedno polje u view:
Code:
CREATE VIEW ListaStranaka AS
SELECT
s.ID_Stranka, s.Naziv, s.ID_TipStranke, ts.TipStranke
FROM
Stranke AS s
LEFT JOIN
TipoviStranaka AS ts ON ts.ID_TipStranke = s.ID_TipStranke
Sada ce query [SELECT * FROM ListaStranaka WHERE ID_TipStranke = 2] da radi, ali kako? Prvo dovuce sve stranke (izvrsi ce select koji kreira view), pa tek onda se nad tim podacima izaberu (Selectuju) oni koji imaju ID_TipStranke = 2. To je jos i prihvatljivo za ovaj simple primer, ali sta ako imas milion stranaka ili ne daj boze aplikaciju za banku?
Da ne duzim, problemi pri svakom Selectu gde je dataprovider view a ne tabela su sledeci:
- Naknadno filtriranje je moguce samo po poljima koja su selectovana u view, cak iako znas strukturu tabela na kojima se view zasniva
- Najpre se izvrsi ceo view pa tek onda ostatak selecta
- Eliminises sve optimizacije DB Servera, jer forsiras execution planner da radi na tacno odredjen nacin
Upravo zbog ovih razloga view-ovi se u praksi koriste najcesce za male kolicine podataka ili za podatke koje ne treba naknadno filtrirati ili transformisati (npr. top 10 kupaca ili neki kumulativni izvestaj)
Btw., MSSQL 2005 omogucava tzv. indexed view-e koji su nesto brzi, ali su toliko ograniceni preduslovima da su neupotrebljivi.