Views/Indexe 5 Views/Indexe Views - Benutzersichten Erstellen: CREATE VIEW [benutzer.]view_name [(spalten_liste)] AS select_anw - Einschränkungen: Die SELECT-Anweisung innerhalb CREATE VIEW darf den UNION-Operator und die ORDER-BY-Klausel nicht enthalten. Die SELECT-Anweisung innerhalb CREATE VIEW darf die DISTINCT-Angabe nicht enthalten. Abfragen: Jede Abfrage auf eine View wird vom SQL Server in eine entsprechende Abfrage auf die zugrundeliegende Basistabelle umgewandelt. INSERT-Anweisung und Views: - Wenn die View aus mehreren Tabellen abgeleitet ist, darf das Einfügen der Zeilen nur erfolgen, falls ausschliesslich die Zeilen einer einzigen Tabelle in der Projektion der SELECT-Anweisung angegeben sind. - Keine Spalte der View darf aus einer Aggregatfunktion abgeleitet werden. - Keine Spalte der View darf aus einer Konstanten oder einem arithmetischen Ausdruck abgeleitet werden. - Die SELECT-Anweisung innerhalb CREATE VIEW darf die Angabe DISTINCT nicht enthalten. - Die View, die mit Hilfe einer SELECT-Anweisung und Join definiert ist, darf die WITH CHECK-Option nicht enthalten. UPDATE-Anweisung und Views: - Wenn die View aus mehreren Tabellen abgeleitet ist, darf das Einfügen der Zeilen nur erfolgen, falls ausschliesslich die Zeilen einer einzigen Tabelle in der Projektion der SELECT-Anweisung angegeben sind. - Keine Spalte der View darf aus einer Aggregatfunktion abgeleitet werden. - Keine Spalte der View darf aus einer Konstanten oder einem arithmetischen Ausdruck abgeleitet werden. - Die SELECT-Anweisung innerhalb CREATE VIEW darf die Angabe DISTINCT nicht enthalten. DELETE-Anweisung und Views: - Wenn die View aus mehreren Tabellen abgeleitet ist, darf das Löschen der Zeilen nur erfolgen, falls ausschliesslich die Zeilen einer einzigen Tabelle in der Projektion der SELECT-Anweisung angegeben sind. - Keine Spalte der View darf aus einer Aggregatfunktion abgeleitet werden. TFH Berlin/Steyer 5-1 Views/Indexe Indexe - Anfrageoptimierung Erstellen: CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED] INDEX index_name ON tab_name(spalte_1 [,spalte_2,...]) [WITH {FILLFACTOR=n, IGNORE_DUP_KEY, SORTED_DATA, IGNORE_DUP_ROW|ALLOW_DUP_ROW]}] [ON segment] Nur der Eigentümer einer Tabelle darf einen Index für sie erstellen (und diesen später wieder löschen). UNIQUE legt fest, dass jeder Datenwert nur einmal in der indizierten Spalte vorkommen darf. Bei der CLUSTERED-Angabe werden alle Zeilen einer Tabelle in der Reihenfolge des Index intern (physikalisch) sortiert. Die Angabe FILLFACTOR=n definiert den Prozentsatz des belegten Speichers jeder Indexseite beim Erstellen des Index. n=100 empfiehlt sich nur für statische Tabellen. Beispiel: CREATE UNIQUE INDEX i_arb_mpr ON arbeiten (m_nr, pr_nr) WITH FILLFACTOR=80 Das Erstellen eines UNIQUE-Index für eine Spalte ist nicht möglich, falls diese Spalte mehrfach vorhandene Werte enthält. Im folgenden Beispiel wird die Möglichkeit gezeigt, wie mehrfach vorhandene Werte einer Spalte gefunden und entfernt werden können, damit anschliessend ein UNIQUE-Index für diese Spalte erstellt werden kann. create view v_hilftab (m_nr, max_dat) as select m_nr, max(einst_dat) from arbeiten group by m_nr having count(*) > 1 delete from arbeiten where exists (select * from v_hilftab where arbeiten.m_nr = v_hilftab.m_nr) and arbeiten.einst_dat < (select max_dat from v_hilfdat where arbeiten.m_nr = v_hilftab.m_nr) (4 rows affected) Entferne alle Zeilen der Tabelle arbeiten bis auf die Zeilen, die für jeden Mitarbeiter das jüngste Einstellungsdatum enthalten. TFH Berlin/Steyer 5-2