Это миф, что индексы не используются, если они фрагментированы?

Правда ли, что SQL Server не использует фрагментированные индексы?

Как это возможно, и если да, то как оптимизатор принимает решение, использовать индекс или нет?

Я искал вокруг, но не смог найти формулу/правила, которые заставляют SQL Server игнорировать определенный индекс.

РЕДАКТИРОВАТЬ:

На самом деле, я нашел следующее утверждение в этой статье. :

Высокая фрагментация. Если индекс фрагментирован более чем на 40 %, оптимизатор, вероятно, проигнорирует индекс, поскольку поиск по фрагментированному индексу обходится дороже, чем сканирование таблицы.

Получается, что оптимизатор все-таки игнорирует фрагментированные индексы. Может ли кто-нибудь принести больше света, как это делается?


person gotqn    schedule 05.02.2014    source источник
comment
На самом деле я не верю этой статье, я запускаю несколько серверов SQL, на которых мы не запускаем обслуживание индексов, поскольку это вызывает больше сбоев, чем что-либо еще, плюс в любом случае это в общей SAN, поэтому дефрагментация в любом случае бессмысленна. Эти индексы в значительной степени фрагментированы на 80/90% и все еще используются оптимизатором.   -  person steoleary    schedule 07.02.2014


Ответы (2)


SQL Server не учитывает фрагментацию в процессе выбора индекса, следующая простая статья хорошо объясняет работу механизма выбора индекса SQL Server:

Выбор индекса и оптимизатор запросов

person steoleary    schedule 05.02.2014
comment
Что ж, я прочитал вашу ссылку, и другие, пытающиеся найти где-то, заявили, что фрагментированный индекс используется или не используется, но терпит неудачу. Итак, я думаю, если нигде не указано, что они игнорируются, ваш ответ правильный :-) - person gotqn; 06.02.2014

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

Чтобы определить, используется ли индекс, SQL-сервер использует статистику. Если вы считаете, что индекс можно использовать, но он не используется сервером, ваша статистика может быть неверной.

Если вы хотите узнать больше о статистике: http://blog.idera.com/sql-server/understanding-sql-server-statistics/ Дополнительная информация о фрагментации индекса и о том, что с этим можно сделать: http://www.brentozar.com/archive/2012/08/sql-server-index-fragmentation/

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

Пример: если статистика показывает, что только одна строка (из тысяч) имеет искомое значение, я думаю, что она будет использовать индекс, независимо от того, насколько он фрагментирован. Вместо всей таблицы нужно будет прочитать всего 3 страницы. Если статистика показывает, что 50% значений находятся в поиске, то используется сканирование таблицы. Используется ли сканирование индекса или таблицы, определяется статистикой. Высокая фрагментация повлияет на скорость (частичного) сканирования индекса и, таким образом, приведет к тому, что оптимизатор выберет сканирование таблицы раньше, чем с нефрагментированным индексом. Так что, хотя это параметр, который влияет на качество вашего индекса, я не думаю, что индекс не существует только потому, что он сильно фрагментирован.

Тем не менее, не позволяйте вашим индексам фрагментироваться :). Microsoft предлагает реорганизовать любой индекс с фрагментацией > 5 % и перестроить индекс с фрагментацией > 30 %. (http://support.microsoft.com/kb/2755960) Но это также зависит от того, как в этой таблице делается много вставок.

person Pieter    schedule 05.02.2014