2008-08-27 2 views
6

У меня есть таблица со многими миллионами строк. Мне нужно найти все строки с определенным значением столбца. Этот столбец не находится в индексе, поэтому результаты сканирования таблицы.Сканирование таблицы и добавление индекса - что быстрее?

Но было бы проще добавить индекс со столбцом в голову (следующий ключевой ключ), выполнить запрос, а затем отбросить индекс?

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

ответ

2

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

2

Нет, это не было бы быстрее. Что бы быстрее было просто добавить индекс и оставить его там!

Конечно, может быть нецелесообразно индексировать каждый столбец, но с другой стороны. Как данные добавляются в таблицу?

2

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

Было сказано, сколько у вас колонок? Вы уверены, что не можете просто создать индекс для каждого из них, если время запроса для одной находки слишком велико?

7

Я не DBA, но я бы предположил, что построение индекса потребует сканирования стола в любом случае.

Если в этом столбце не будет несколько запросов, я бы рекомендовал не создавать индекс.

Лучше всего проверить планы объяснений/сроки выполнения в обоих направлениях!

2

Это зависит от сложности вашего запроса. Если вы извлекаете данные один раз, то выполнение сканирования таблицы выполняется быстрее. Однако, если вы возвращаетесь к таблице более одного раза для соответствующей информации в одном запросе, индекс быстрее.

Другая связанная стратегия - это выполнить сканирование таблицы и поместить все данные во временную таблицу. Затем проиндексируйте THAT, а затем вы можете делать все ваши последующие выборки, группировки и столько же запросов в подмножестве индексированных данных. Преимущество в том, что поиск связанной информации в связанных таблицах с использованием таблицы temp намного быстрее.

Однако в наши дни пространство дешево, поэтому вам, вероятно, лучше всего будет служить, исследуя, как ваши пользователи фактически используют вашу систему и добавляют индексы на эти часто встречающиеся столбцы. Я еще не видел, что пользователи все время используют ВСЕ параметры поиска.

3

Как и все остальные, было бы, скорее всего, не быстрее добавлять индекс, чем выполнить полное сканирование этого столбца.

Однако я бы предложил отслеживать шаблон запроса и выяснить, какие столбцы (и) искали больше всего, и добавить индексы, по крайней мере, для них. Вы можете узнать, что 3-4 индекса ускоряют 90% ваших запросов.

9

Два вопроса думать о:

  1. Сколько столбцов может быть выдвинут на запрос?
  2. Часто ли данные меняются? Много этого?

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

«« Священство! », слышу. Большинство источников сообщают вам, что «никогда» не индексируют каждый столбец таблицы, но это пособие основано на общем предположении, что таблицы часто изменяются.

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

Как маленький является небольшой и сколько много, и является компромиссом стоит? Невозможно рассказать о монастыре, потому что «слишком медленно» обычно является субъективным измерением.

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

[Добавлено] О, еще одно: временные индексы не только физически медленнее, чем сканирование таблицы, но они разрушат ваш параллелизм. Повторная индексация таблицы обычно (всегда?) Требует полной блокировки таблицы, поэтому на самом деле одновременно может выполняться только один пользовательский поиск.

Удачи.

2

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

Сколько столбцов существует? Как часто данные обновляются? Как быстро нужно запускать вставки и обновления? В зависимости от ответов на эти вопросы есть компромиссы. Проведите множество экспериментов и испытаний, чтобы вы точно знали, как это будет происходить.

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

Смежные вопросы