Benutzer-Werkzeuge

Webseiten-Werkzeuge


views

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Both sides previous revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
views [2016/01/08 13:46]
chorn
views [2016/01/08 00:00] (aktuell)
Zeile 2: Zeile 2:
  
 Als "​VIEW"​ kann man prinzipiell eine Art virtuelle Tabelle verstehen, die durch ein gespeichertes SQL-Statement mit SELECT, JOIN, WHERE, ORDER BY etc. in Echtzeit definiert wird und die wie jede andere Tabelle im DBMS per SQL wieder abgefragt werden kann. Als "​VIEW"​ kann man prinzipiell eine Art virtuelle Tabelle verstehen, die durch ein gespeichertes SQL-Statement mit SELECT, JOIN, WHERE, ORDER BY etc. in Echtzeit definiert wird und die wie jede andere Tabelle im DBMS per SQL wieder abgefragt werden kann.
 +
 +Ein einfaches Beispiel anhand von Produkten und Bestellungen die in aktuelle Käufe und höchsten Umsatz resultieren:​
 +
 +Tabellen anlegen
 +
 +  create table products (asin varchar(50),​ name varchar(250),​ price decimal(5,​2));​
 +  create table orders (asin varchar(50),​ quantity integer, buy datetime);
 +  ​
 +Daten einpflegen
 +
 +<code sql>
 +  insert into products(asin,​ name, price) values
 +  ("​A1",​ "​Apfel",​ 1.23),
 +  ("​B2",​ "​Birne",​ 2.34),
 +  ("​C3",​ "​Orange",​ 3.45),
 +  ("​D4",​ "​Pflaume",​ 3.45);
 +</​code>​
 +
 +<code sql>
 +  insert into orders(asin,​ quantity, buy) values
 +  ("​A1",​ 2, "​2016-01-08 12:​00:​00"​),​ -- ok
 +  ("​B2",​ 3, "​2016-01-07 12:​00:​00"​),​ -- ok
 +  ("​E5",​ 4, "​2016-01-06 12:​00:​00"​),​ -- no related product
 +  ("​A1",​ 5, "​2016-01-05 12:​00:​00"​),​ -- out of time
 +  ("​C3",​ 1, "​2016-01-06 12:​00:​00"​) ​ -- insufficient quantity
 +</​code>​
 +
 +Was steht drin?
 +
 +<code sql>
 +  select * from products
 +</​code>​
 +
 +
 +^ asin ^ name ^ price ^
 +| A1 | Apfel | 1.23 |
 +| B2 | Birne | 2.34 |
 +| C3 | Orange | 3.45 |
 +| D4 | Pflaume | 3.45 |
 +
 +
 +<code sql>
 +  select * from orders
 +</​code>​
 +
 +
 +^ asin ^ quantity ^ buy ^
 +| A1 | 2 | 2016-01-08 12:00:00 |
 +| B2 | 3 | 2016-01-07 12:00:00 |
 +| E5 | 4 | 2016-01-06 12:00:00 |
 +| A1 | 5 | 2016-01-05 12:00:00 |
 +| C3 | 1 | 2016-01-06 12:00:00 |
 +
 +
 +Eine View für Bestellungen ab dem 6.1.
 +
 +<code sql>
 +  create view recentOrders as
 +  select *
 +  from orders
 +  inner join products using(asin)
 +  where
 +  buy >= "​2016-01-06 12:​00:​00"​
 +  and quantity > 1
 +  order by
 +  buy asc,
 +  quantity desc
 +</​code>​
 + 
 +<code sql>
 +  select * from recentOrders
 +</​code>​
 +
 +Ergebnis:
 +
 +
 +^ asin ^ quantity ^ buy ^ name ^ price ^
 +| B2 | 3 | 2016-01-07 12:00:00 | Birne | 2.34 |
 +| A1 | 2 | 2016-01-08 12:00:00 | Apfel | 1.23 |
 +
 +  ​
 +Für C, D, und E sind keine Ergebnisse vorhanden, da kein entsprechendes Produkt vorlag, die Bestellung älter als einen Tag oder die Stückzahl zu klein war.
 +
 +Und hier eine View für Artikel mit höchsten Umsatz:
 +
 +<code sql>
 +  create view highSalery as
 +  select
 + p.*,
 + count(o.asin) as sold,
 + count(o.asin) * price as total
 +  from products p
 +  left join orders o using(asin)
 +  group by asin
 +  order by total desc
 +</​code>​
 + 
 +<code sql>
 +  select * from highSalery
 +</​code>​
 +
 +Ergebnis:
 +
 +
 +^ asin ^ name ^ price ^ sold ^ total ^
 +| C3 | Orange | 3.45 | 1 | 3.45 |
 +| A1 | Apfel | 1.23 | 2 | 2.46 |
 +| B2 | Birne | 2.34 | 1 | 2.34 |
 +| D4 | Pflaume | 3.45 | 0 | 0.00 |
 +
  
 ---- ----
Zeile 7: Zeile 117:
 ===== Materialisierte Sicht ===== ===== Materialisierte Sicht =====
  
-Bei einer "​MATERIALIZED VIEW" handelt es sich um eine Art Cache zur Performanceoptimierung. Im Gegensatz zur View wird hier das Ereignis, das zum Aktualisierung der Ergebnisse führt, ​umgedreht:+Bei einer "​MATERIALIZED VIEW" handelt es sich um eine Art Cache zur Performanceoptimierung. Im Gegensatz zur View wird hier das Ereignis, das zum Aktualisierung der Ergebnisse führt, ​vom Client in die Datenbank selbst verlegt: 
 + 
 +  * Bei der Abfrage einer **View** durch den **Client** werden die geforderten Daten aus den einzelnen Tabellen und Relationen zusammengetragen und zurückgeliefert,​ der Trigger liegt auf der **Abfrage** der Sicht 
 +  * Beim Abruf der **Materialized View** werden die Daten aus dem Cache zurückgeliefert. Der Cache wird erst durch den **Server** aktualisiert,​ sobald **Daten geändert** werden (Update). Die Last entsteht ausschliesslich bei Schreiboperationen. 
 + 
 +Um eine Materialized View anzulegen braucht man nur das entsprechende Schlüsselwort voranzustellen,​ z.B.: 
 + 
 +<code sql> 
 +  create materialized view recentOrders as ... 
 +</​code>​ 
 + 
 +danach kann man die View durch beliebige Trigger auf involvierte Relationen aktualisieren
  
-  * Bei der Abfrage einer //View// durch den Client werden die geforderten Daten aus den einzelnen Tabellen und Relationen zusammengetragen und zurückgeliefert,​ der Trigger liegt auf der //Abfrage// der Sicht +<code sql> 
-  ​* Beim Abruf der //​Materialized View// werden die Daten aus dem Cache zurückgeliefert. Der Cache wird erst aktualisiert,​ sobald //Daten geändert// werden ​(Update). Die Last entsteht ausschliesslich bei Schreiboperationen.+  ​CREATE TRIGGER materialize after insert or update or delete on orders EXECUTE PROCEDURE materialize()
 +</​code>​
views.1452257208.txt.gz · Zuletzt geändert: 2016/01/08 00:00 (Externe Bearbeitung)