Ćwiczenia > Perspektywy w MS SQL Server 2000 > Indeksowanie perspektyw

7.3 Indeksowanie perspektyw



Perspektywa indeksowana to perspektywa, na której zdefiniowano indeks grupowany (jako że pierwszym indeksem na perspektywie musi być indeks grupowany, zaś następnie możemy tworzyć indeksy niegrupowane). W takim przypadku zbiór danych generowany przez widok jest materializowany i przechowywany w najniższym poziomie stron należących do indeksu, tak jak to ma miesjce w przypadku indeksu grupowanego zdefiniowanego na tabeli. Również operacje modyfikacji danych w indeksowanym widoku odbywają się w podobny sposób, jak w tabelach z indeksami (następuje przebudowanie indeksu). Gdy tworzymy indeks na perspektywie, pojęcie wirtualnej tabeli przestaje być aktualne w odniesieniu do perpektywy, ponieważ teraz perspektywa jest materialnym zbiorem danych przechowywanym w bazie danych.

Krok 1 - Jakie wymagania musi spełniać widok, by moża było go indeksować?

Widok musi spełniać następujące wymagania, by można było określić na nim indeks grupowany:
- w trakcie tworzenia perspektywy muszą być włączone opcje ANSI_NULLS i QUOTED_IDENTIFIER,
- w trakcie tworzenia tabel bazowych widoku musi być włączona opcja ANSI_NULLS,
- podczas tworzenia widoku (CREATE VIEW) musi zostać użyta opcja SCHEMABINDING,
- tylko dwie części nazw (właściciel.obiekt - w normalnej sytuacji nazwy mogą mieć więcej członów) mogą zostać użyte w definicji widoku do odwoływania się do obiektów bazy danych (tabel lub funkcji użytkownika),
- jeśli używamy funkcji w definicji widoku, to muszą być to funkcje deterministyczne,
- wszystkie nazwy kolumn muszą być jawnie (i tylko raz) określone w widoku (niedopuszczalny jest symbol gwiazdki),
- widok nie może zawierać kolumn typów: text, ntext oraz image,
- widok nie może zawierać danych z tabel zagnieżdżanych, funkcji zwracających zestawy rekordów, złączeń typu UNION,złączeń zewnętrznych (OUTER JOIN) oraz złączeń tabeli z samą sobą (ang. self join),
- polecenie SELECT w definicji widoku nie może zawierać klauzul TOP, ORDER BY, DISTINCT, COMPUTE, COMPUTE BY, HAVING, CUBE oraz ROLLUP,
- w poleceniu SELECT w definicji funkcje agregujące mogą wystąpć tylko wtedy, gdy użyta jest klauzula GROUP BY; nie mogą zostać użyte złożone funkcje agregujące, czyli: AVG, MIN, MAX, STDEV, STDEVP, VAR oraz VARP,
- nie można użyć funkcji COUNT(*) (ale można COUNT_BIG(*)).

W praktyce, jeżeli tworzysz w miarę nieskomplikowane widoki (złączenie wewnętrzne kilku tabel), to prawie zawsze możesz indeksować widok, pod warunkiem, że w definicji widoku umieścisz opcję WITH SCHEMABINDING.

Natomiast jeśli zamierzasz tworzyć widok, który będzie bardziej żłożony - np. będzie korzystał z funkcji użytkownika (których nie omawiamy w podręczniku), to musisz stosować się do powyższych zaleceń.

Do ustawiania opcji połączenia używaj polecenia SET:

SET ARITHABORT ON 
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET NUMERIC_ROUNDABORT OFF

Jeśli chcesz sprawdzić, czy funkcja jest deterministyczna, możesz użyć składni:

SELECT OBJECTPROPERTY ( object_id('nazwa_funkcji'),'IsDeterministic') 
Zwrócona wartość 1 mówi o tym, że funkcja jest deterministyczna.
W podobny sposób możesz sprawdzić, czy utworzony widok można zaindeksować:

SELECT OBJECTPROPERTY ( object_id('nazwa_widoku'),'IsIndexable') 
Zwrócona wartość 1 mówi o tym, że widok można indeksować.
Aby sprawdzić, jakie inne właściwości obiektów możesz przeglądać, zobacz opis funkcji OBJECTPROPERTY w Books Online.


Krok 2 - Tworzenie indeksu na perspektywie

Tworzenie indeksu na perspektywie odbywa się tak samo, jak to ma miejsce w przypadku tabel (patrz lekcja 5.2 Tworzenie indeksów).

Przykład:


-- przykladowy indeks na wyimaginowanym
-- widoku w bazie Northwind
CREATE UNIQUE CLUSTERED INDEX high_sales_UCI 
ON High_Sales_View (orderid, customerid, productid)


Krok 3 - Zalety i wady indeksowanych perspektyw

Główną zaletą indeksowanych perspektyw jest zwiększona szybkość wyszukiwania danych. Dotyczy do szczególnie przypadków, gdy w indeksowanym widoku dokonujemy agregacji i wyliczeń. Dane są wówczas przechowywane w indeksie i nie muszą być przeliczane przy każdym odwołaniu do widoku.

Wadą indeksowania perspektyw jest oczywiście to, że tworzona jest kopia danych oraz fakt, że przy operacjach zapisu indeks musi zostać przebudowany (a w przypadku użycia agregacji i obliczeń - także te operacje muszą zostać powtórzone).

Do projektu Prace dyplomowe dołącz plik indeksy_widoki.sql, w którym przeprowadź sprawdzenie, czy dotychczasowo utworzone przez Ciebie widoki można zaindeksować (użyj funkcji OBJECTPROPERTY). Spróbuj też utworzyć widok, który będzie można zaindeksować (jego definicję zamieść w skrypcie). Jeśli chcesz, utwórz jakiś indeks dla wybranej perspektywy - w dokumentacji napisz, jak wybierałeś kolumny do indeksowania.


Przejdź dalej



Ćwiczenia > Perspektywy w MS SQL Server 2000 > Indeksowanie perspektyw