Согласие с Marc и Unkown выше ... 6 индексов в кластерном индексе - это слишком много, особенно для таблицы, которая имеет только 14 столбцов. У вас не должно быть больше 3 или 4, если это, я бы сказал, 1 или 2. Возможно, вы знаете, что кластеризованный индекс - это фактическая таблица на диске, поэтому при вставке записи ядро базы данных должно ее отсортировать и Поместите его в упорядоченное место на диске. Некластеризованные индексы не являются, они поддерживают поиск таблиц. Мои VLDB размещены на диске (CLUSTERED INDEX) в соответствии с 1-м пунктом ниже.
- Уменьшите свой кластеризованный индекс до 1 или 2. Лучший выбор полей - это IDENTITY (INT), если он у вас есть, или поле даты, в котором поля добавляются в базу данных, или какое-либо другое поле, которое является естественный вид того, как ваши данные добавляются в базу данных. Дело в том, что вы пытаетесь сохранить эти данные в нижней части таблицы ... или разместить их на диске наилучшим образом (более 90%), чтобы вы могли прочитать записи. Это делает так, чтобы не происходила реорганизация или что требуется один-единственный удар, чтобы получить данные в нужном месте для лучшего чтения. Обязательно поместите удаленные поля в некластеризованные индексы, чтобы не потерять эффективность поиска. Я НИКОГДА не помещал более 4 полей в мои VLDB. Если у вас есть поля, которые часто обновляются, и они включены в ваш кластеризованный индекс, OUCH, это приведет к реорганизации записи на диске и вызовет COSTLY-фрагментацию.
- Проверьте коэффициент заполнения по вашим индексам. Чем больше коэффициент заполнения (100), тем полнее будут страницы данных и страницы индекса. В зависимости от того, сколько записей у вас есть и сколько записей вы вставляете, вы измените коэффициент заполнения # (+ или -) ваших некластеризованных индексов, чтобы обеспечить пространство для заполнения при вставке записи. Если вы измените свой кластеризованный индекс на последовательное поле данных, это не будет иметь большого значения для кластерного индекса. Эмпирическое правило (IMO), коэффициент заполнения 60-70 для высокой записи, 70-90 для средней записи и 90-100 для высокой записи / низкой записи. Снижение коэффициента заполнения до 70 означает, что на каждые 100 записей на странице записывается 70 записей, что оставляет свободное место в 30 записей для новых или реорганизованных записей. Съедает больше места, но это наверняка превосходит необходимость дефрагментации каждую ночь (см. 4 ниже)
- Убедитесь, что статистика существует в таблице. Если вы хотите использовать базу данных для создания статистики, используя "sp_createstats 'indexonly", то SQL Server создаст всю статистику по всем индексам, которые накопил механизм, как требующие статистики. Не исключайте атрибут «indexonly», иначе вы добавите статистику для каждого поля, тогда это не будет хорошо.
- Проверьте таблицу / индексы, используя DBCC SHOWCONTIG, чтобы увидеть, какие индексы наиболее фрагментированы. Я не буду вдаваться в подробности, просто знайте, что вам нужно это сделать. Затем, основываясь на этой информации, измените коэффициент заполнения вверх или вниз относительно изменений, которые испытывают индексы, и как быстро (с течением времени).
- Установите расписание заданий, которое будет выполняться в режиме онлайн (DBCC INDEXDEFRAG) или в автономном режиме (DBCC DBREINDEX) для отдельных индексов, чтобы выполнять их дефрагментацию. Предупреждение: не делайте DBCC DBREINDEX для этой большой таблицы, если она не выполняется во время обслуживания, потому что это приведет к отключению приложений ... особенно в CLUSTERED INDEX. Вы были предупреждены. Протестируйте и протестируйте эту часть.
- Используйте планы выполнения, чтобы увидеть, какие существуют СКАНЕРЫ и ЖИРНЫЕ ТРУБЫ, и откорректировать индексы, затем дефрагментировать и перезаписать сохраненные процедуры, чтобы избавиться от этих горячих точек. Если вы видите КРАСНЫЙ объект в вашем плане выполнения, это потому, что в этом поле нет статистики. Это плохо. Этот шаг - скорее «искусство, чем наука».
- В непиковое время запустите UPDATE STATISTICS WITH FULLSCAN, чтобы предоставить обработчику запросов как можно больше информации о распределении данных. В противном случае выполняйте стандартную СТАТИСТИКУ ОБНОВЛЕНИЯ (со стандартным 10% -ным сканированием) для таблиц в будние дни или чаще, если вы считаете нужным свои наблюдения, чтобы убедиться, что механизм имеет больше информации о распределениях данных для эффективного извлечения данных.
Извините, это так долго, но это очень важно. Я только дам вам здесь минимальную информацию, но очень помогу. Есть некоторые интуитивные чувства и наблюдения, которые относятся к стратегиям, используемым этими пунктами, которые потребуют вашего времени и тестирования.
Нет необходимости переходить на версию Enterprise. Я сделал для того, чтобы получить функции, о которых говорилось ранее, с разделением. Но я сделал ОСОБЕННО, чтобы иметь намного лучшие возможности многопоточности с поиском и онлайн-дефрагментацией и обслуживанием ... В редакции Enterprise, это намного лучше и более дружелюбно с VLDB. Стандартная версия также не поддерживает DBCC INDEXDEFRAG с онлайн-базами данных.