Дизайн таблицы индекса - PullRequest
       31

Дизайн таблицы индекса

2 голосов
/ 22 декабря 2010

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

Эта таблица (назовем ее таблицей TASK) станет самой большой таблицей во всем приложении.Ожидается миллионы записей.

ВАЖНО : массовая массовая вставка добавляет данные в эту таблицу

таблица имеет 27 столбцов: (пока что и подсчет: D)

int x 9 столбцов = id-s

varchar x 10 столбцов

бит x 2 столбца

datetime x 5 столбцов

INT COLUMNS

все это INT ID, но из таблиц, которые обычно меньше таблицы задач (максимум 10-50 записей), пример: таблица состояния (со значениями типа "открыто",«Закрытый») или Таблица приоритетов (со значениями, такими как «важный», «Не так важен», «Нормальный»), также есть столбец, такой как «идентификатор родителя» (собственный идентификатор)«маленькие» таблицы имеют PK, обычный способ ... кластеризованный

STRING COLUMNS

есть столбец (строка) (Company!), который похож на«5 символов длиной все время», и каждый пользователь будет ограничен в использовании этого.Если в Задаче есть 15 разных «Компаний», то вошедший в систему пользователь увидит только одну.Так что всегда есть фильтр на этот.Может быть хорошей идеей будет добавить индекс в этот столбец?

КОЛОННЫ ДАТЫ

Я думаю, они не индексируют эти ... верно?Или может / должно быть?

Ответы [ 3 ]

5 голосов
/ 22 декабря 2010

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

Чтобы выяснить, какие индексы нужно добавить, необходимо знать:

  • какие запросы используются к вашей таблице - что за предложения WHERE, что за ORDER BY вы делаете?

  • как распределяются ваши данные? Какие столбцы достаточно избирательны (<2% данных), чтобы их можно было использовать для индексации </p>

  • Какое (отрицательное) влияние оказывают дополнительные индексы на ваши ВСТАВКИ и ОБНОВЛЕНИЯ в таблице

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

И уверен Вы можете индексировать столбец DATETIME - что заставило вас думать, что вы не можете ?? Если у вас есть много запросов, которые ограничат свой набор результатов с помощью диапазона дат, может иметь смысл индексировать столбец DATETIME - возможно, не сам по себе, а в составном индексе вместе с другими элементами вашей таблицы. .

То, что вы не можете индексировать, - это столбцы, которые содержат более 900 байтов данных - что-то вроде VARCHAR(1000) или около того.

Для получения более подробной и полной информации об индексации, обратитесь к блогу Кимберли Триппа , Королева индексирования.

3 голосов
/ 22 декабря 2010

в общем случае индекс ускорит JOIN, операцию сортировки и фильтр.

SO, если столбцы находятся в выражении JOIN, ORDER BY или WHERE, тогда индекс поможет с точки зрения производительности.... но всегда есть но ... с каждым добавленным индексом операции UPDATE, DELETE и INSERT будут замедляться, потому что индексы должны поддерживаться

, поэтому ответ ... это зависит

Я бы сказал, начните нажимать на таблицу с запросами и посмотрите на планы выполнения для сканирования, попробуйте выполнить эти поиски, либо написав запросы SARGable, либо добавив индексы, если необходимо ... не просто добавьте индексы дляради добавления индексов

1 голос
/ 22 декабря 2010

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

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

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

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

Если вам часто требуется набор данных, основанный на статусе, индексация по этому столбцу может быть хорошей, особенно если 1% ваших строк «Активен» против 99% «Не активен», и все, что вам нужно, это активные.

И наоборот, если ваш «PriorityId» используется только для получения «метки», указывающей, что такое PriorityId 42 (то есть соединение с таблицей поиска), вам, вероятно, не нужен индекс для него в основной таблице.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...