Лучше для производительности SQL-запросов использовать фактическую денормализованную таблицу с индексами, а не индексированное представление? - PullRequest
3 голосов
/ 07 января 2010

Чтобы повысить производительность запроса, я создал денормализованное индексированное представление, которое содержит некоторую информацию, по которой я должен сообщать. Когда я не получил прирост производительности, на который надеялся, я создал табличную версию своего представления с индексами и получил значительно лучшую производительность.

Я должен отметить, что когда я создаю свое представление, в SELECT много ISNULL. Я знаю, что это может повлиять на производительность, если эти столбцы объединятся в обычном представлении, но у меня сложилось впечатление, что все будет в порядке, если представление будет проиндексировано. Могут ли ISNULL быть проблемой?

Ответы [ 2 ]

4 голосов
/ 07 января 2010

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

CREATE VIEW dbo.denormalized
WITH SCHEMABINDING
AS
    SELECT  A.id,
            A.col1,
            A.col2,
            ISNULL(B.col3, '') col3
    FROM    dbo.A LEFT JOIN dbo.B ON A.Bid = B.id
GO

CREATE UNIQUE CLUSTERED INDEX UIX_denormlaized
ON dbo.denormalized (id)

Пока все хорошо. Теперь мы попробуем выбрать из этого представления следующее:

SELECT id, col3 FROM denormalized

Единственными постоянными данными для этого представления является индекс в столбце идентификатора - остаток должен быть отработан на лету. Таким образом, ISNULL рассчитывается снова для каждой строки. Однако, если мы добавим этот индекс:

CREATE INDEX IX_denormalized
ON dbo.denormalized (id, col3)

тогда тот же запрос обслуживается полностью из постоянного индекса - гораздо быстрее, фактически эквивалентно производительности выбора из таблицы.

1 голос
/ 07 января 2010

Какой SQL Server SKU?Только Enterprise Edition учитывает индексированные представления в плане запросов.Standard Edition не будет рассматривать индексированное представление, если только выбор не из представления и не использует подсказку NOEXPAND.

Обновление

Поскольку я уже получил два комментария, указывающих, что этоПолезно знать, я связываю соответствующую страницу MSDN Разрешение индексов в представлениях :

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

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