Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top