2012-02-08 17 views
11

Próbuję utworzyć indeksowany widok w SQL Server i zastanawiałem się, czy muszę indeksować kolumn widoku.Wyświetlenia indeksowane programu SQL Server

Pytam o to, ponieważ widok składa się z tabel, które już mają indeksowane kolumny.

Więc jeśli TABLE1 została kolumna FOO już indeksowane jako non klastrowym indeksie, muszę dodać indeks na kolumnie FOO do nowo utworzonego widoku dla SQL Server, aby skorzystać z indeksu?

A może SQL Server będzie wiedział, jak korzystać z indeksu w TABELA 1 podczas przeszukiwania widoku?

Widok wygląda to

CREATE VIEW [dbo].[v_eventActivity] 
WITH SCHEMABINDING 
AS 
    SELECT ea.id, 
     e.eventID, 
     e.name, 
     ea.userID, 
     ea.activityTypeID, 
     ea.timeStamp, 
     ea.visitDuration 
    FROM dbo.table1 e, 
     dbo.table2 ea 
    WHERE e.eventID = ea.eventID 

mam zamiar być na poszukiwania tych wszystkich kolumn razem.

Jak już wcześniej wspomniano, wszystkie tabele 1 i tabela 2 mają już te indeksowane kolumny.

+0

Myślałem, że znam odpowiedź na to, ale na piśmie ustalenia, że ​​w rzeczywistości nie mam. Dobry Q! najlepszym sposobem na poznanie może być wypróbowanie tego i zobaczenie. również powinieneś określić, jaka jest wersja SS. – JNK

+0

Zwykle widok indeksowany nie reprezentuje całej tabeli, więc reprezentowanie indeksu na konkretnej kolumnie zwykle nie ma sensu. Czy masz już utworzony widok? Czy możesz udostępnić strukturę tabeli, indeks, o którym mówisz, oraz definicję widoku (w tym jego indeksów)? –

+0

Rzeczywiście spróbowałem. Plan wykonania zapytań mówi, że korzysta z indeksu oryginalnych tabel. Ale chciałem się upewnić. – KDV

Odpowiedz

4

Indeksowane widoki w SQL Server są tak blisko, jak nie ma znaczenia, tak zwany zmaterializowany widok w innym miejscu. Jeśli widok zawiera zapytanie bazowe, które używa indeksów zdefiniowanych w tabelach podstawowych, wybór w widoku będzie również wykorzystywał indeks, a nie o indeksowane widoki.

Jeśli często korzystasz z widoku, a wydajność ma znaczenie, możesz zrezygnować z większej ilości miejsca na dysku (i czasu procesora) i utworzyć unikalny indeks klastrowy w widoku, co umożliwi jeszcze szybsze zapytania w widoku, ponieważ SQL Server nie będzie musiał wracać do tabeli podstawowej lub tabel, i pobierać wszystko, czego potrzebuje od indeksu widoku.

Spójrz na here.

+1

Jeśli jest to już widok indeksowany, nie można dodać unikalnego indeksu klastrowanego w widoku. To jest definicja widoku indeksowanego (nie można utworzyć indeksu unikalnego lub nieklastrowego w widoku, chyba że istnieje już unikalny indeks klastrowy). –

+1

@AaronBertrand: widok nie może mieć wcześniejszych indeksów, nie sugeruję, że ma! Tabele mogą mieć indeksy. – Mithrandir

+1

Sposób, w jaki ją czytam, Twój opis sprawia, że ​​powinieneś dodać unikalny indeks klastrowy do widoku indeksowanego. –

7

Widok po prostu użyje indeksu tabeli, chyba że podano podpowiedź NOEXPAND (dokumentacja here).

Można przetestować ten sam sposób następujący:

CREATE TABLE [test].[TestTable] (
    id INT IDENTITY PRIMARY KEY, 
    foo INT 
) 

CREATE NONCLUSTERED INDEX ixFoo 
ON [test].[TestTable] (foo) 

CREATE VIEW [test].[TestTableView] WITH SCHEMABINDING 
AS 
    SELECT 
     t.id, 
     t.foo 
    FROM [test].[TestTable] t 
GO 

CREATE UNIQUE CLUSTERED INDEX ixFooId 
ON [test].[TestTableView] (id) 

CREATE NONCLUSTERED INDEX ixFooView 
ON [test].[TestTableView] (foo) 

Oto plan wykonania dla trzech oddzielnych zapytań:

SELECT 
    t.[id], 
    t.[foo] 
FROM [test].[TestTable] t 
ORDER BY t.[foo] 

The table query execution plan

SELECT 
    v.[id], 
    v.[foo] 
FROM [test].[TestTableView] v 
ORDER BY v.[foo] 

The view with no hint

SELECT 
    v.[id], 
    v.[foo] 
FROM [test].[TestTableView] v WITH (NOEXPAND) 
ORDER BY v.[foo] 

The view with the NOEXPAND hint

Powiązane problemy