Индексация большой таблицы в SQL SERVER

У меня большая таблица (более 10 миллионов записей). эта таблица активно используется для поиска в приложении. Итак, мне пришлось создать индексы для таблицы. Однако при вставке или обновлении записи в таблице производительность снижается. Скорее всего, это связано с перерасчетом индексов.

Есть ли способ улучшить это.

заранее спасибо

Кстати, 10M строк уже не большие. Возможно, в MS Access SQL Server не должен беспокоиться об этом.

Mark Brady 12.11.2008 21:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
9 582
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Нам нужно увидеть ваши индексы, но, скорее всего, да.

Следует иметь в виду, что вы не хотите просто помещать индекс в каждый столбец, и вам обычно не нужен только один столбец на индекс.

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

Это классический инженерный компромисс ... вы можете сделать лопату легче или прочнее, но не то и другое вместе ... (до прорыва в материаловедении).

Больше индекса означает больше обслуживания DML, означает более быстрые запросы.

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

Возможно, некоторые из ваших индексов будут избыточными и их можно будет объединить.

Помимо того, что написал Джоэл, вам также необходимо определить SLA для DML. Это нормально, что он медленнее, вы заметили, что он замедлился, но действительно ли это имеет значение по сравнению с улучшением запросов, которое вы достигли ... IOW, можно ли иметь такую ​​слабую лопату?

Вы можете выбрать несколько решений

а) Вы можете разделить таблицу

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

c) Поскольку разработка - это баланс компромиссов, вам нужно будет выбрать, что важнее (Выбрать или Обновить / вставить / удалить) и какая операция важнее. Предполагая, что вам не нужны результаты в реальном времени для «вставки», вы можете использовать сервисный брокер сервера Sql для этих операций, чтобы выполнять «менее важную» операцию асинхронно.

http://msdn.microsoft.com/en-us/library/ms166043(SQL.90).aspx

Спасибо -RVZ

Ответ принят как подходящий

Вы можете попробовать уменьшить количество разделений страниц (в ваших индексах), уменьшив коэффициент заполнения в ваших индексах. По умолчанию коэффициент заполнения равен 0 (соответствует 100 процентам). Итак, когда вы перестраиваете свои индексы, страницы полностью заполняются. Это отлично подходит для таблиц, которые не изменяются (вставка / обновление / удаление). Однако при изменении данных индексы должны измениться. При коэффициенте заполнения 0 вы гарантированно получите разделение страниц.

Изменив коэффициент заполнения, вы должны повысить производительность при вставках и обновлениях, потому что страница НЕ ВСЕГДА должна разделяться. Я рекомендую вам перестроить индексы с коэффициентом заполнения = 90. Это оставит 10% страницы пустыми, что приведет к меньшему разбиению страниц и, следовательно, к меньшему количеству операций ввода-вывода. Возможно, что 90 - не оптимальное значение для использования, поэтому здесь может быть задействован метод проб и ошибок.

При использовании другого значения для коэффициента заполнения ваши избранные запросы могут стать немного медленнее, но с коэффициентом заполнения 90% вы, вероятно, не заметите этого слишком сильно.

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

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

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