Widoki są tworem dość często wykorzystywanym w bazach SQL – dobrze zaplanowane bardzo ułatwiają pracę z bazą. Widoki indeksowane zapewniają lepszą wydajność zapytań. Niestety nie zawsze nasz indeks będzie brany pod uwagę podczas wykonania zapytania.
Załóżmy, że mamy w baze widok vEmployeesSales – prosty widok z jednym joinem i prostym grupowaniem. Widok ten ma zdefiniowany index – CIDX_vEmployees.
Standardowe zapytanie:
SELECT * FROM vEmployeesSales
uwzględni nasz indeks jedynie w bazach w wersji Enterprise i Developer. Jeżeli korzystamy z popuplarnej (nawet w systemach produkcyjnych) wersji Express indeks zostanie pominięty.
Aby zachęcić optymalizator do wykorzystania naszego indeksu musimy do zapytania (po klauzuli FROM) dodać opcję WITH (NOEXPAND):
SELECT * FROM vEmployeesSales WITH (NOEXPAND)
Różnicę widać na planie wykonania:
oraz w czasie wykonania – zapytanie 1 zajęło 57ms, zapytanie 2 poniżej 1ms.
Należy pamięć, że aby stworzyć indeks na widoku, widok ten musi zostać stworzony z opcją WITH SCHEMABINDING.
Na koniec ten sam test na bazie SQL2008 Enterprise:
1 comment
Comments are closed.