Indexed View vs Indexes on Table

У меня есть следующая таблица

EVENT_LOG:

EVENT_ID: pk, int, not null
TYPEID: fk, int, not null
CATEGORYID: fk, int, null
SOURCE: varchar(255), null
DESCRIPTION: varchar(4000), null
CREATED: datetime, null

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

Мы задавались вопросом, будет ли параметр (материализованное представление AKA) вариантом, где индексированное представление будет содержать все столбцы из EVENT_LOG, но имеют соответствующие индексы, созданные на представлении. Получит ли это производительность для отчетности, не влияя на запись в таблицу EVENT_LOG?

Ответ 1

Индексированное представление вызовет те же проблемы, что и индекс в столбце, поскольку индексированные представления требуют with schemabinding, которые напрямую привязывают его к таблице, не позволяя вам каким-либо образом изменять/изменять схему этой таблицы, или форму. Это включает изменение размера столбца (например, от varchar(50) до varchar(255)), изменение типа данных столбца (например, от double до decimal(18,5)) и т.д. Я видел, что они вызывают много неожиданных головных болей из-за к этому факту.

Мое предложение - создать хранимую процедуру или пакет SSIS, который создаст для вас отчетную таблицу, которая запускается каждый час или около того. Таким образом, вы можете индексировать вечно любящий ад из этого и пользоваться всеми преимуществами производительности, которые он производит. Я стесняюсь сообщать о происходящем в реальном времени. Я на самом деле еще не видел случая, когда это необходимо. Для целей отчетности часовая информация, как правило, абсолютно достаточна для выполнения заданий.

Ответ 2

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

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

Ответ 3

"Источники и столбцы описания должны искать подстроки."

При поиске подстрок в столбцах varchar() SQL Server не будет использовать какие-либо индексы (даже если вы скопируете таблицу и создадите индексы) Индексы не используются, если в начале строки поиска используется дикий символ.

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

Таким образом, мое предложение состояло бы в создании индекса Full Text Index на столбцах varchar() и внесении изменений в качестве руководства и запуска его каждый час или около того, когда нет DML..., который уменьшил бы нагрузки на INSERT заявления

Ответ 4

Нет, если вы собираетесь писать, если часто, так как у вас будет стоимость исполнения индекса на вашем материализованном представлении. Материализованные представления больше для данных, которые не меняются часто.

Ответ 5

У меня возникла аналогичная проблема. Решил добавить многоколоночный индекс против рекомендаций от администратора базы данных. На моей машине разработки и сервере (с разрешениями DBA) производительность для записи увеличилась и отчетность была значительно быстрее (17x), чем создание индексов по отдельным столбцам. Почему, я не знаю, так как я не являюсь администратором баз данных, но я знаю основы, и иногда это помогает вам видеть сквозь лес/деревья. Поэтому я согласен с Eric Pertroelje, вы должны добавить индексы и измерить производительность записи и даже измерить производительность чтения.