Индексировать или не индексировать - есть ли причины индексировать столбцы, уже включенные в первичный ключ?

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

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

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

Основное беспокойство вызывает Sql Server, но такая ситуация может возникнуть и на сайтах, использующих Oracle.


person haughtonomous    schedule 25.07.2013    source источник
comment
Каков порядок столбцов в индексе и какие запросы вы будете фильтровать, которые вас беспокоят?   -  person Ben    schedule 25.07.2013


Ответы (3)


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

person Kenny Evitt    schedule 25.07.2013
comment
Область действия такова - если столбец индексируется путем включения в первичный ключ, есть ли какое-либо преимущество в добавлении отдельного индекса для этого столбца? Ваш ответ выглядит как «в целом да», что говорит мне то, что мне нужно знать. Меня всегда учили обратному (если только это не неизбежно, только один раз проиндексируйте столбец, даже если это составной индекс), но это было давно. - person haughtonomous; 25.07.2013
comment
@haughtonomous - может быть, просто отредактируйте заголовок вопроса, чтобы уточнить, о чем вы спрашиваете. - person Kenny Evitt; 25.07.2013
comment
Не уверен, что не так с названием - можете ли вы предложить улучшение? - person haughtonomous; 25.07.2013

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

Например: если ключ индекса - (ColA,ColB,ColC) (CREATE INDEX MyIndexName ON MySchema.Mytable(ColA,ColB,ColC) ...), тогда SQL Server (по умолчанию) может ' t пропустить первый столбец (ColA) для поиска во втором столбце (ColB). Для составных индексов SQL Server может искать по столбцу, если есть предикат равенства (обычно этот шаблон <Column> = <Constant>, но также прочитайте последний абзац моего ответа) по предыдущим столбцам:

[1] SARGable ‹=> поиск по индексу следующие предикаты (всего несколько примеров)

WHERE ColA=@p1
WHERE ColA<=@p1
WHERE ColA>@p1
WHERE ColA=@p1 AND ColB=@p2
WHERE ColA=@p1 AND ColB=@p2 AND ColC=@p3
WHERE ColA=@p1 AND ColB=@p2 AND ColC<=@p3
WHERE ColA=@p1 AND ColB=@p2 AND ColC>@p3
.. For a complete picture please read SQLMag article from the last paragraph

[2] Следующие предикаты (всего несколько примеров) не поддаются поиску или не поддаются полностью поисковому запросу.

WHERE ColB=@p2, потому что в предыдущем столбце отсутствует предикат равенства: ColA В этом случае может быть полезен индекс с этим ключом (ColB).

WHERE ColA>=@p1 AND ColB=@p2, потому что в первом столбце нет предиката равенства: ColA. В этом случае может быть полезен индекс с этим ключом (ColB,ColA).

WHERE ColA=@p1 AND ColB<=@p2 AND ColC=@p3, потому что предикат во втором столбце (ColB) не равен. В этом случае может быть полезен индекс с одним из этих ключей (ColA,ColC,ColB) или (ColC,ColA,ColB).

Подробнее по этой теме (SARGable): ссылка;

Это означает, что если у вас есть индекс с этим ключом (ColA,ColB,ColC), тогда эти индексы (ColB), (ColB,ColA), (ColA,ColC,ColB) или (ColC,ColA,ColB) также могут быть полезны.

person Bogdan Sahlean    schedule 25.07.2013
comment
Ваш ответ намного лучше моего! - person Kenny Evitt; 25.07.2013

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

Вот еще один полезный совет:

  1. Вы можете запустить SQL Management Studio и выполнить некоторые из ваших запросов SELECT / INSERT / UPDATE / DELETE, используя "Показать предполагаемый план выполнения". Это даст вам наглядный график того, что СУБД делает изнутри. Если вы видите «сканирование таблиц» или «сканирование индексов», вы можете повысить производительность, добавив индексы, чтобы изменить их на «поиск таблицы» или «поиск по индексу», что намного эффективнее.

  2. Вы можете установить инструмент под названием SQL Performance Dashboard. Это фантастический инструмент, предоставляемый Microsoft, который фактически проверяет запросы / транзакции к вашей базе данных из вашего приложения и предоставляет отчеты SSRS с предлагаемыми подсказками о том, где добавить индексы и т. Д. Отчеты панели мониторинга доступны для SQL Server 2008 и более поздних версий. .

person Warren Rox    schedule 25.07.2013
comment
Это не правильно; ограничение первичного ключа может содержать несколько столбцов. - person Kenny Evitt; 25.07.2013
comment
Вы абсолютно правы. В моем исходном сообщении (до того, как я отредактировал) я хотел сказать, что у вас может быть только один первичный ключ. Если он использует несколько столбцов для первичного ключа, преимущества / предостережения все равно можно определить, используя методы, которые я включил в свой ответ. - person Warren Rox; 25.07.2013
comment
Интересно. Для меня это означает, что наше приложение (которое обновляет свою базу данных с каждым новым выпуском, если вносятся изменения) не может предсказать, какие индексы могут существовать на сайте, потому что клиенты могут свободно определять свои собственные запросы отчетов и вполне могут добавлять новые индексы для улучшения отчетности. представление. Хм.... - person haughtonomous; 25.07.2013
comment
@haughtonomous - управление индексами в рамках миграции базы данных (изменения схемы) сложно для приложения с несколькими экземплярами для разных клиентов, особенно если использование базы данных значительно различается между клиентами. Однако у вас должна быть возможность поддерживать довольно хорошие индексы, которые должны достаточно хорошо работать для большинства клиентов. И есть способы позволить клиентам поддерживать свои собственные индексы; но если вы это сделаете, я надеюсь, что вам платят за ваши расходы на поддержку! - person Kenny Evitt; 25.07.2013