SQL: представление к таблице - запросы к представлению все еще используют индексы таблицы? - PullRequest
4 голосов
/ 01 июня 2009

Я использую представление ("UsersActive") для моей таблицы ("Users"). Представление имеет только один фильтр, оно проверяет, имеет ли DateTime Users.DeletedOn значение NULL; в основном он содержит всех пользователей, которые не были удалены.

Если я теперь выполню запросы Linq для представления вместо таблицы, будут ли они по-прежнему использовать индексы таблиц или мне нужно будет создавать специальные индексы для представления? В моем понимании View - это не что иное, как предопределенный запрос, и он должен работать так же, как если бы я обращался к этому напрямую:

SELECT * FROM пользователей, ГДЕ DeletedON = NULL

Правильно ли мое предположение, что индексы базовой таблицы по-прежнему будут использоваться правильно?

Ответы [ 5 ]

6 голосов
/ 01 июня 2009

В большинстве случаев SQL Server Query Optimizer достаточно умен, чтобы использовать индексы базовой таблицы. Вы можете увидеть это, посмотрев планы запросов.

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

2 голосов
/ 01 июня 2009

Представления практически полностью прозрачны непосредственно для базовых операторов SQL. Это хорошее надежное предположение о дизайне.

1 голос
/ 01 июня 2009

Индексированное представление сильно отличается от неиндексированного.

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

Индексированное представление материализует (и обновляет) индекс. Это доступно пользователям представления, но все еще может не использоваться.

Дополнительное примечание, основанное на вашем примере, - индекс может использоваться не так эффективно для критериев NULL, как для столбцов флага или кода.

0 голосов
/ 02 июня 2009

Скорее всего вам нужно переписать ваш запрос:

ВЫБРАТЬ * ИЗ ПОЛЬЗОВАТЕЛЕЙ, ГДЕ УДАЛЕНО НА НУЛЕ

DeletedON = NULL не будет истинным, даже если DeletedON IS NULL

0 голосов
/ 01 июня 2009

Представление, если оно не проиндексировано, будет обновляться каждый раз с использованием запроса, который его определяет. Если таблица в этом запросе проиндексирована, будут использованы индексы таблицы.

Вы также можете индексировать свое представление, и в этом случае набор данных будет зафиксирован на физическом диске, и у вас будет два набора индексов.

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