2012-02-08 3 views
11

Я пытаюсь создать индексированный вид в SQL Server, и мне было интересно, если мне нужно индексировать столбцы представления.SQL Server индексированные представления

Я спрашиваю об этом, потому что представление состоит из таблиц, которые уже имеют индексированные столбцы.

Так что если TABLE1 имеет столбец FOO уже проиндексирован как не кластерный индекс, я должен добавить индекс для столбца FOO для вновь созданного представления для SQL Server, чтобы использовать индекс?

Или SQL Server знает, использовать индекс в TABLE1 при поиске в представлении?

мнение выглядит следующим образом

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 

я собираюсь быть поиск на всех этих столбцов вместе.

Как указано выше, в таблице 1 и таблице2 все индексы уже имеют указанные столбцы.

+0

Я думал, что я знал ответ на этот вопрос, но в письменном виде он определил, что на самом деле у меня нет. Хороший Q! лучший способ узнать, может быть, попробовать и посмотреть. также вы должны указать версию SS. – JNK

+0

Обычно индексированный вид не представляет всю таблицу, поэтому представление индекса в определенном столбце обычно не имеет смысла. Вы уже создали представление? Можете ли вы поделиться структурой таблицы, индексом, о котором говорите, и определением для представления (включая его индексы)? –

+0

Я действительно попробовал. В плане выполнения запроса говорится, что он использует индекс исходных таблиц. Но я просто хотел убедиться. – KDV

ответ

4

Индексированные представления в SQL Server, так же, как не имеет значения, что называется материализованным представлением в другом месте. Если у вашего представления есть базовый запрос, который использует индексы, определенные в базовых таблицах, выбор в представлении также будет использовать этот индекс, это не то, что индексированные представления.

Если вы используете представление довольно часто, и производительность имеет значение, вы можете отказаться от большего количества дискового пространства (и времени процессора) и создать уникальный кластерный индекс в представлении, тем самым включить даже более быстрые запросы в представлении, потому что SQL Server не придется возвращаться к базовой таблице или таблицам и получать все, что нужно от индекса представления.

Посмотрите here.

+1

Если это уже индексированное представление, вы не можете добавить уникальный кластеризованный индекс в представление. Это определение индексированного представления (вы не можете создать не-уникальный или некластеризованный индекс в представлении, если только уникальный кластерный индекс уже существует). –

+1

@AaronBertrand: представление не должно иметь предшествующих индексов, я не подразумеваю, что он имеет! Таблица (ы) может иметь индексы. – Mithrandir

+1

Как я его читал, ваше описание заставляет его добавить, что вы должны добавить уникальный кластерный индекс в индексированное представление. –

7

Вид будет просто использовать индекс таблицы, если не указан подсказку NOEXPAND (документация here).

Вы можете проверить это себя следующим образом:

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) 

Вот план выполнения трех отдельных запросов:

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

Смежные вопросы