2009-01-08 3 views
0

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

Должен ли я создавать индексы на этих таблицах? Почему или почему нет?

ответ

4

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

+0

Это отличная идея, если вы не знаете, как работает база данных. Но эти системы не являются полностью черными ящиками. Если он случайно поворачивает ручки, комбинации могут занять некоторое время. Clustered or not, 1 столбец или много, высокая мощность или низкие, случайные данные или упорядоченные ... –

3

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

2

Как Ray says, все зависит от ситуации, и единственный способ сказать - попробовать его под нагрузкой.

С теоретической точки зрения: да, добавление индексов в таблицу замедляет вставки, поскольку СУБД должна поддерживать все индексы с каждой вставкой. Но вы заметите? Будет ли иметь значение наблюдаемая производительность? Возможно, нет. Индексы обычно хранятся в структурах B + Tree, которые могут быть вставлены в O (log n), что неплохо, не говоря уже обо всем кэшировании диска и т. Д. Таким образом, единственный способ узнать наверняка - попробовать это как пути и посмотреть, какая разница.

0

Я не эксперт по Sql-серверу, но я работал с старшим инженером Microsoft по производительности одной из наших систем. По его словам, способ, которым MSSS находит страницу для вставки новой строки, - это «Сканирование свободного пространства» ... сканирование каждой страницы, в которой требуется найти страницу с пространством для вставки строки.

Если вы добавили кластерный индекс в таблицу, вы вынуждаете данные перемещаться в одном конкретном месте. Скажем, вы добавляете столбец автономера в эту таблицу и делаете его кластеризованным индексом. Теперь MSSS не сканирует свободный блок, он знает, что 1000 ДОЛЖЕН перейти сразу после 999; поэтому он делает ход индекса a.

Я бы дал этот снимок. Не стоит слишком долго пробовать 4 или 5 миллионов строк.