SQL Server кластеризованный индекс на представлении - PullRequest
2 голосов
/ 22 июня 2009

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

Мне нужно получить кластерный индекс, иначе запросы, использующие представление, будут выполняться вечно. Очевидно, что сервер sql будет хранить результирующий набор, только если вы соответствуете глупому количеству критериев.

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

Кто-нибудь знает какой-нибудь способ заставить сервер sql кэшировать результаты представления, чтобы их можно было запросить позже? Я на самом деле не хочу создавать еще один стол, который бы превратился в кучу изменений повсюду.

Заранее спасибо.

Ответы [ 6 ]

3 голосов
/ 22 июня 2009

Я думаю, что вы ищете ответ: Не используйте вид, чтобы сделать это. Используйте таблицу с полями, соответствующими возвращенным полям, из запроса sql. Автоматизировать запрос для заполнения этой таблицы

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

при использовании агрегатов внутри индексированного представления необходимо использовать COUNT_BIG () вместо COUNT (), иначе представление не будет создано

Также, если вы не используете Enterprise Edition, вам нужно указать подсказку NOEXPAND, иначе оптимизатор не будет использовать представление

SELECT *
FROM YourView WITH(NOEXPAND)
WHERE ....

Возможно, вам не нужно представление, но у вас просто нет правильных индексов в таблицах, вы можете опубликовать DDL таблиц (включая индексы и ограничения)

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

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

Затем вы можете построить представления поверх этих таблиц, если вам нужно.

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

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

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

Короткий ответ: кластерный индекс не может быть создан по указанным вами причинам.

Когда вы запрашиваете способ кэширования результатов сложного запроса, единственный другой объект, который SQL Server предоставляет (и решит вашу проблему), - это таблица.

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

Если вы используете службы SSIS (службы интеграции SQL Server), добавить это довольно тривиально.

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

У меня возникла та же проблема, и в итоге я поместил подзапросы в сами представления кластеризованного индекса.

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