Индексировать или не индексировать - PullRequest
0 голосов
/ 08 января 2009

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

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

Ответы [ 4 ]

4 голосов
/ 08 января 2009

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

3 голосов
/ 08 января 2009

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

2 голосов
/ 08 января 2009

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

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

0 голосов
/ 08 января 2009

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

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

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

...