2009-12-28 3 views
5

Я создал скрипт, чтобы найти избирательность каждого столбца для всех таблиц. В некоторых таблицах с менее чем 100 строк избирательность столбца составляет более 50%. Где Селективность = Значимые значения/Общее число строк. Являются ли эти столбцы подходящими для индекса? Или, можете ли вы сказать мне минимальное требование для количества строк для создания индекса?Какое минимальное количество строк требуется для создания индекса?

ответ

5

Вы можете индексировать на любой колонке - вопрос, имеет ли какой-то смысл и будет ли использоваться этот показатель ....

Как правило, селективность менее 1-5% может работать - меньше этот процент, тем лучше. Лучше всего одно значение из большой совокупности, например. один идентификатор клиента из сотен тысяч - эти индексы определенно будут использоваться.

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

Но на самом деле, единственный способ выяснить, имеет ли или нет индекса смысл заключается в

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

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

Для некоторых экспертных рекомендаций о том, как иметь дело с индексами, и как узнать, какие индексы могут не привыкают, и когда это имеет смысл создать индекс, см сообщения пользователя Kimberly Tripp в:

+0

У меня есть таблица с тремя значениями зацепления, и все они являются объективными. Селективность составляет более 95%. И эта таблица в основном используется только с инструкцией select. Так можно ли создать индекс на этом? – Paresh

+0

95% избирательный смысл? TYpically, вы хотите очень низкую избирательность - вы хотите, чтобы одно значение (ID = 55) выбирало только минимальное количество строк. Если ваша избирательность в этом сценарии (в процентах от количества строк из общей суммы будет выбрана для заданного значения вашего поля) составляет менее 5% или лучше даже менее 1%, то, безусловно, имеет смысл индексировать. –

+0

«Такие вещи, как пол (всего 2 значения)», теперь, когда это 2018 год, эта часть вашего ответа устарела. С этого момента пол должен быть VARCHAR (255). Я лично идентифицирую себя как атакующий вертолет. –

0

Я не уверен, что SQL-сервер, но большинство СУБД не использовать индекс для поиска я f он может извлекать все строки таблицы в одном вводе-выводе. Вы увидите это в пояснениях PLAN, некоторые таблицы всегда сканируются в табличном пространстве.

IMHO, любая таблица с менее чем 5000 строк не стоит анализировать для мощности, если СУБД работает на сервере.

2

В большинстве СУБД используется кэш для данных и кода (хранимая процедура, план выполнения и т. Д.). В SQL Server я думаю, что это называется данные и процедура кэш, и в Oracle, это называется кэш-буфера и SGA. Данные таблицы и/или индекс могут находиться в кеше.

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

Большая разница в производительности - доступ к диску против доступа к памяти. Цель индекса - уменьшить объем данных для чтения с диска, но если он уже находится в памяти, коэффициент усиления, вероятно, мал.

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