Microsoft SQL Server 2008 - 99% фрагментация по некластеризованному, не уникальному индексу

У меня есть таблица с несколькими индексами (определено ниже). Один из индексов (IX_external_guid_3) имеет фрагментацию 99% независимо от перестройки/реорганизации индекса. Кто-нибудь знает, что может вызвать это или лучший способ исправить это?

мы используем Entity Framework 4.0 для запроса этого, запросы EF на другие индексированные поля примерно в 10 раз быстрее в среднем, чем поле external_guid_3, однако ADO.Net запрос примерно одинаковой скорости на обоих (хотя 2x медленнее, чем запрос EF к индексированным полям).

таблица

  • id (PK, int, not null)
  • guid (uniqueidentifier, null, rowguid)
  • external_guid_1 (uniqueidentifier, не null)
  • external_guid_2 (uniqueidentifier, null)
  • состояние (varchar (32), null)
  • значение (varchar (max), null)
  • infoset (XML (.), null) -- > обычно 2-4K
  • created_time(datetime, null)
  • updated_time (datetime, null)
  • external_guid_3(uniqueidentifier, не null)
  • FK_id (FK, int, null)
  • locking_guid (uniqueidentifer, null)
  • locked_time (datetime, null)
  • external_guid_4(uniqueidentifier, null)
  • corrected_time (datetime, null)
  • is_add (бит, не null) оценка (int, null)
  • row_version(метки, null)

индексы

  • PK_table(Кластерных)
  • IX_created_time (Не Уникальный, Не Кластеризованный)
  • IX_external_guid_1 (Не Уникальный, Не Кластеризованный)
  • IX_guid (Не Уникальный, Не Кластеризованный)
  • IX_external_guid_3 (Не Уникальный, Не Кластеризованный)
  • IX_state (Не Уникальный, Некластеризованный)

4 ответов


Примечание: рекомендации SQL Server утверждают, что индексы с менее чем 10 000 страниц обычно не выигрывают от повышения производительности.

см.http://technet.microsoft.com/en-gb/library/cc966523.aspx http://technet.microsoft.com/en-us/magazine/2008.08.database.aspx?pr=blog

вот небольшой фрагмент, чтобы определить, когда ваша БД нуждается в дефрагментации.В нашем продукте мы сократили это до 2000 и выбрали фрагментацию >20%. Вы можете легко изменить скрипт, чтобы рассказать вам, какие индексы, в частности.

SELECT COUNT(*) AS fragmented_indexes FROM sys.dm_db_index_physical_stats(DB_ID(), null, null, null, null) as p WHERE p.avg_fragment_size_in_pages <= 1 AND p.avg_fragmentation_in_percent >= 20 AND p.page_count > 2000;

на самом деле это выглядит просто как индексация на guid может быть виновником здесь: http://www.sqlskills.com/blogs/paul/can-guid-cluster-keys-cause-non-clustered-index-fragmentation/

в последнее время я нахожу несколько ссылок, которые, похоже, поддерживают это.


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

пока количество страниц индекса не достигнет 100 или около того, фрагментация не повлияет на производительность.

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

запустите запрос из среды management studio (вы можете запрос с помощью SQL profiler или монитора активности, если он динамический) и нажмите "Включить фактический план выполнения". Это покажет вам, какой индекс используется, и если запрос покрыт.


Turn db auto shrink off. Кажется, это имеет побочный эффект фрагментации индексов.