Вопрос по sql-server, sql – Что такое индексы и как их использовать для оптимизации запросов в моей базе данных? [Дубликат]

29

This question already has an answer here:

What is an index in SQL? 11 answers

Я поддерживаю довольно большое приложение и базу данных и отмечаю низкую производительность базы данных в некоторых наших хранимых процедурах.

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

Мне в основном нужны индексы 101.

Может ли кто-нибудь дать мне ресурсы, чтобы я мог учиться?

@mmattax, вы должны принять один из ответов здесь, есть несколько действительно хороших Nathan Koop

Ваш Ответ

9   ответов
5

Индексы - это метод, который системы баз данных используют для быстрого поиска данных. Аналогия с реальным миром - указатели в книгах. Если автор / издатель хорошо справляется с индексацией своей книги, читателю становится довольно легко непосредственно перейти на страницу, которую он хочет прочитать, просто взглянув на указатель. То же самое касается базы данных. Если для поля создается индекс, база данных предварительно сортирует данные. Когда делается запрос к данным, база данных использует индекс, чтобы определить, в каком месте хранятся данные на жестком диске, и напрямую отправляется туда. Если индексов нет, базе данных необходимо просмотреть каждую запись, чтобы выяснить, соответствует ли она критериям вашего запроса.

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

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
24

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

Error: User Rate Limit Exceeded
30

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

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

Созданные индексы необходимо поддерживать. Если у вас много действий по изменению данных, они могут стать фрагментированными и снизить производительность, и их необходимо обновить. Читайте в Книгах онлайн об индексах. Вы также можете найти там синтаксис для оператора создания индекса.

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

Error: User Rate Limit ExceededcouldError: User Rate Limit Exceededpossible valuesError: User Rate Limit Exceededactual valuesError: User Rate Limit Exceeded
1

Еще немного информации об индексе!

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

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

Есть над чем подумать - создание слишком большого количества индексов является распространенной ошибкой. Каждый раз, когда ваши данные обновляются, ваша БД должна выполнять поиск по этому индексу и обновлять его, вставляя записи в каждый индекс этой таблицы для этой новой строки. В транзакционных системах (подумайте: биржевые транзакции NYSE!) Это может быть убийцей приложений.

1

Индекс можно объяснить как отсортированный список элементов в реестре. Очень быстро искать позицию элемента в регистре, ища его ключ в индексе. Затем ключ в указателе является указателем на позицию в регистре, где можно найти остальную часть записи.

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

3

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

Ваш инструмент # 1 для определения того, что делает ваша база данных SQL Server, является профилировщиком. Вы можете профилировать целые рабочие нагрузки, а затем посмотреть, какие индексы он рекомендует. Вы также можете посмотреть планы выполнения, чтобы увидеть, какие эффекты имеет индекс.

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

1

Индексы создаются в существующей таблице для более быстрого и эффективного поиска строк. Можно создать индекс для одного или нескольких столбцов таблицы, и каждому индексу будет присвоено имя. Пользователи не могут видеть индексы, они просто используются для ускорения запросов.

По сути, ваша СУБД создаст некую древовидную структуру, которая сортирует данные (из одного столбца). Таким образом, легче искать данные по этим столбцам.

http://en.wikipedia.org/wiki/Index_(database)

Error: User Rate Limit Exceededen.wikipedia.org/wiki/Index_(database)
Error: User Rate Limit Exceeded
0

для mssql (и, возможно, других) синтаксис выглядит так:

create index <indexname> on <tablename>(<column1>[,<column2>...])
5

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

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

Большинство баз данных имеют инструмент для объяснения того, как будет работать ваш запрос (для db2 это db2expln, что-то похожее, вероятно, для sqlserver), и инструмент для предложения индексов и других оптимизаций (db2advis для db2, опять же, вероятно, что-то подобное для sqlserver).

Error: User Rate Limit Exceeded

Похожие вопросы