Как можно создать кластерный индекс по представлению - PullRequest
3 голосов
/ 26 августа 2009

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

Где я могу пропустить точку?

Ответы [ 3 ]

3 голосов
/ 26 августа 2009

Индекс всегда существует на диске. При создании индекса вы материализуете строки представления на диске, даже если само представление не является «реальными» строками.

MSDN Белая книга с пояснениями

2 голосов
/ 26 августа 2009

Это несколько упрощенное объяснение. Там много технической ухмылки, происходящей под капотом, но это звучало так, как будто вы хотели общее объяснение "васпуп".

Представление, по сути, является предварительно записанным и сохраненным запросом; всякий раз, когда вы получаете доступ к представлению, вы извлекаете и вставляете этот предварительно написанный запрос в текущий запрос. (По крайней мере, так я думаю об этом.)

Таким образом, эти «базовые» представления считывают данные, которые хранятся в таблицах, уже присутствующих в базе данных / на жестком диске. Когда вы строите кластерный индекс в представлении, вы действительно делаете вторую физическую копию данных, на которую ссылается представление. Например, если у вас есть таблица A, создайте представление vA как «select * from A», а затем создайте кластерный индекс для этого представления, в результате чего вы получите две копии данных на жестком диске.

Это может быть полезно, если таблица A очень большая, и вы хотите быстрый доступ к небольшому подмножеству таблицы (например, только 2-3 столбца или только там, где Status = 1, или вы хотите быстрый доступ к данным для этого требуется безобразное соединение.)

Забавность наступает, когда вы обновляете таблицу A (на самом деле, любую из таблиц, на которые ссылается представление), поскольку любые изменения в «базовой» таблице также необходимо вносить в таблицу «view». Не очень хорошая идея для интенсивно используемых систем OLTP.

К вашему сведению, я считаю, что "индексированные представления" в SQL называются "материализованными представлениями" в Oracle. За мои деньги Materialized View - гораздо лучшее имя / описание.

2 голосов
/ 26 августа 2009

Хотя представление не является реальным объектом, кластеризованный индекс имеет вид.

И строки, возвращаемые представлением, могут быть отсортированы и сохранены.

Однако, чтобы быть индексируемым, представление должно удовлетворять ряду условий.

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

Например, SUM(*) и COUNT_BIG(*) являются распределительными функциями:

SUM(set1) + SUM(set2) = SUM(set1 + set2)
COUNT_BIG(set1) + COUNT_BIG(set2) = COUNT_BIG(set1 + set2)

, поэтому при изменении таблицы легко пересчитать значения SUM и COUNT_BIG, используя только строки представления и значения затронутых столбцов.

Однако с другими агрегатами дело обстоит иначе, поэтому они не допускаются в индексированном представлении.

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