Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по курсу ИСиТ.docx
Скачиваний:
6
Добавлен:
07.02.2024
Размер:
1.07 Mб
Скачать

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

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

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

Другое преимущество создания индекса для представления заключается в том, что оптимизатор будет использовать этот индекс в запросах, в которых представление не упоминается в предложении FROM непосредственно. Извлечение данных из индексированного представления может привести к повышению эффективности уже имеющихся запросов, при этом их не нужно переписывать.

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

Индексированные представления повышают эффективность запросов следующих типов:

  • Соединения и статистические вычисления, в ходе которых обрабатывается большое число строк.

  • Соединения и статистические вычисления, которые часто выполняются несколькими запросами. Например, при работе с базой данных OLTP, хранящей информацию о материально-технических запасах, скорее всего, потребуется часто соединять таблицы ProductMaster, ProductVendor и VendorMaster. Даже если в каждом запросе с соединением обрабатывается небольшое число строк, общая трата ресурсов на выполнение сотен тысяч таких запросов может оказаться существенной. Так как подобные связи обычно обновляются нечасто, общую производительность всей системы можно повысить, определив индексированное представление, хранящее результаты операций соединения.

  • Запросы систем поддержки принятия решений. Одной из особенностей аналитических систем является то, что в них хранятся статистические данные, обновляемые сравнительно редко. Во многих запросах систем поддержки принятия решений выполняется дополнительная статистическая обработка данных и соединение многих строк. Кроме того, системы поддержки принятия решений иногда содержат крупные таблицы с большим количеством крупных столбцов. Эффективность запросов, ссылающихся на подмножество этих столбцов, можно повысить, создав индексированное представление, включающее только те столбцы, которые упоминаются в запросе, или слегка расширенное надмножество этих столбцов. Создание представлений с узким индексом, содержащих подмножество столбцов одной таблицы, называется стратегией вертикального секционирования, потому что при этом таблица делится по вертикали.

Рассмотрим, например, следующую таблицу и индексированное представление:

CREATE TABLE wide_tbl(a int PRIMARY KEY, b int, ..., z int)

CREATE VIEW v_abc WITH SCHEMABINDING AS

SELECT a, b, c

FROM dbo.wide_tbl

WHERE a BETWEEN 0 AND 1000

CREATE UNIQUE CLUSTERED INDEX i_abc ON v_abc(a)

Чтобы обработать следующий запрос, достаточно представления v_abc:

SELECT b, count_big(*), SUM(c)

FROM wide_tbl

WHERE a BETWEEN 0 AND 1000

GROUP BY b

Представление v_abc занимает гораздо меньше страниц, чем таблица wide_tbl. Таким образом, при разрешении данного запроса оптимизатор, наиболее вероятно, выберет представление, а не таблицу. Однако предпочтительным способов вертикального секционирования таблицы или ее подмножества является не индексированное представление, а некластеризованный индекс таблицы, указавывающий столбцы, которые должны войти в результат, при помощи предложения INCLUDE.

Эффективность запросов следующих типов индексированные представления обычно не повышают:

  • Запросы систем OLTP, включающие большое число операций записи.

  • Операции над часто обновляемыми базами данных.

  • Запросы, не включающие статистических выражений или операций соединения.

  • Статистическая обработка данных с большим количеством элементов ключа GROUP BY. Если количество элементов ключа велико, это означает, что ключ содержит много разных значений. Уникальный ключ имеет максимально возможное количество элементов, потому что каждый ключ имеет свое значение. Индексированные представления повышают эффективность работы с такими ключами, уменьшая число обрабатываемых строк. Если результирующий набор представления включает почти столько же строк, сколько содержится в базовой таблице, выгода от использования представления невелика.

Например, следующий запрос данных из таблицы, включающей 1 000 строк:

SELECT PriKey, SUM(SalesCol)

FROM ExampleTable

GROUP BY PriKey

Если количество элементов ключа таблицы равно 100, индексированное представление, созданное на основе результатов этого запроса, включало бы только 100 строк. При работе с данным представлением для выполнения запросов требовалось бы в среднем в десять раз меньше операций чтения данных из базовой таблицы. Если бы ключ этой таблицы был уникальным, его количество элементов было бы равно 1000 и результирующий набор представления содержал бы 1 000 строк. Если представление и базовая таблица включают строки одинакового размера, использование индексированного представления вместо чтения данных непосредственно из базовой таблицы выгоды не приносит.

  • Соединения с расширением. К этой категории относятся представления, результирующие наборы которых превышают объем данных в базовых таблицах.

Соседние файлы в предмете Информатика