Индексированное представление против индексов в таблице
У меня есть следующая таблица
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
Таблица?
5 ответов
Индексированное представление вызовет те же проблемы, что и индекс для столбца, поскольку индексированные представления требуют with schemabinding
, которые привязывают его к таблице напрямую, не позволяя вам изменять / изменять схему этой таблицы каким-либо образом, по форме или по форме. Это включает в себя изменение размера столбца (например, из varchar(50)
в varchar(255)
), изменяя тип данных столбца (например, из double
в decimal(18,5)
) и т. д. Я видел, как они вызывают много неожиданных головных болей из-за этого факта.
Я предлагаю настроить хранимую процедуру или пакет служб SSIS, который будет создавать таблицу отчетов для вас, которая запускается каждый час или около того. Таким образом, вы можете индексировать вечно любящий ад и наслаждаться всеми преимуществами производительности, которые он дает. Я стесняюсь выступать против сообщений из действующей системы. Я на самом деле еще не видел случай, когда это необходимо. Для отчетности, часовая информация обычно абсолютно достаточна для выполнения работы.
Я бы подумал, что это все равно повлияет на производительность, так как индексы в материализованном представлении необходимо обновить в какой-то момент - хотя, вероятно, он не должен синхронизироваться с записью в таблицу.
Лично я бы поместил индексы в таблицу и сам измерил производительность записи. Вы можете догадаться, насколько медленнее будет запись с указанными там индексами, но пока вы на самом деле не измеряете это, вы просто спекулируете. Это может вообще ничего не изменить.
Msgstr "В столбцах источника и описания нужно искать подстроки. "
При поиске подстрок в столбцах varchar() SQL Server не собирается использовать какие-либо индексы (даже если вы копируете таблицу и создаете индексы). Индексы не используются, если в начале поиска используется дикий символ. строка
Я полагаю, лучше создать полнотекстовый индекс для "Source" и "Description", если вам нужно искать в них подстроки.
Поэтому я бы предложил создать полнотекстовый индекс для столбцов varchar() и сделать отслеживание изменений как ручное и запускать его каждый час или около того, когда нет DML ..., что уменьшит нагрузку на операторы INSERT
Я столкнулся с подобной проблемой. Решил добавить многостолбцовый индекс против советов DBA. На моей машине для разработки и на сервере (с разрешениями администратора баз данных) производительность записи увеличилась, а отчеты были значительно быстрее (в 17 раз), чем при создании индексов для отдельных столбцов. Почему, я не знаю, так как я не администратор, но я знаю основы, и иногда это помогает вам видеть сквозь лес / деревья. Поэтому я согласен с Эриком Пертроэлье: вы должны добавить индексы и измерить производительность записи и даже измерить производительность чтения.
Нет, если вы собираетесь писать, если часто, так как у вас будет стоимость исполнения индекса в вашем материализованном представлении. Материализованные представления больше подходят для данных, которые часто не меняются.