Sql Server 2005 индексированное представление - PullRequest
1 голос
/ 15 марта 2011

Я создал уникальный кластерный индекс для представления.Кластерный индекс содержит 5 столбцов (из 30 в этом представлении), но типичный выбор, использующий это представление, потребует всех 30 столбцов.

Проведение некоторого тестирования показывает, что время, необходимое для запроса 5 столбцовэто намного быстрее, чем все 30 столбцов.Это потому, что это просто естественные издержки в отношении выбора в 6 раз большего числа столбцов, или потому, что индексированное представление не хранит неиндексированные столбцы во временной таблице, и, следовательно, необходимо выполнить некоторые дополнительные шаги для сбора отсутствующих столбцов (объединения набазовые таблицы, я думаю?)

Если последнее, какие шаги предпринять, чтобы предотвратить это?Ну, даже если первое ... каковы некоторые способы обойти это!

Изменить: для сравнения, выбор в индексированном представлении только с 5 столбцами примерно в 10 раз быстрее, чем тот же запрос на базестолы.Но выборка по всем столбцам в основном эквивалентна по скорости запросу по базовым таблицам.

Ответы [ 2 ]

0 голосов
/ 16 марта 2011

Индексированное представление - это копия данных, которые потенциально (и обычно) хранятся (кластеризованы) иным образом, чем базовая таблица.Для всех целей

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

Когда вы выбираете только 5 столбцов из tbl (который имеет индексированное представление ivw)

  • SQL Server полностью игнорирует вашу таблицу и просто выдает данные из ivw
  • , поскольку страницы данных короче (только 5 столбцов), большее количество записей может быть занесено впамяти при каждом извлечении страницы, поэтому вы получаете 5-кратное увеличение скорости

Когда вы выбираете все 30 столбцов - индексированное представление не может быть полезным.Запрос полностью игнорирует представление и просто выбирает данные из базовой таблицы.

IF вы выбираете данные из всех 30 столбцов,

  • , но запрос фильтруетв первых 4 столбцах индексированного представления *
  • и фильтр очень избирательный (приведет к очень небольшому подмножеству записей)

SQL Server может использовать индексированное представление(сканирование / поиск) для быстрой генерации небольшого набора результатов, который он затем может использовать, чтобы ПРИСОЕДИНИТЬСЯ к базовой таблице, чтобы получить оставшиеся данные.

  • Однако, аналогично обычным индексам,индекс для (a, b, c, d, e) или в этом случае кластеризованное индексированное представление для (a, b, c, d, e) NOT помогает запросу, выполняющему поиск по (b, d), д) потому что они не являются первыми столбцами в индексе.
0 голосов
/ 15 марта 2011

Кластерный индекс по определению содержит каждое поле в каждой строке таблицы.В основном это воссоздание таблицы, но с физическими страницами данных в порядке кластерного индекса, с сортировкой по b-дереву для быстрого доступа к указанным значениям вашего кластерного ключа (ключей).

Являетесь ли выпросто получение значений или вы получаете агрегатные функции, такие как MIN(), MAX(), AVG(), SUM() для остальных 25 полей?

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