Индексированные представления SQL Server

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

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

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

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

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

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 все индексы уже индексируются.

Ответ 1

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

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

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

Ответ 2

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

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

Посмотрите здесь.