Индексированные представления SQL Server - PullRequest
11 голосов
/ 08 февраля 2012

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

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

Таким образом, если 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 

Я буду искать по всемиз этих столбцов вместе.

Как указывалось ранее, для таблиц table1 и table2 все эти столбцы уже проиндексированы.

Ответы [ 2 ]

7 голосов
/ 08 февраля 2012

Представление будет просто использовать индекс таблицы, если не указана подсказка 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

4 голосов
/ 08 февраля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...