Фрагментацията на индекса на SQL Server е често срещан източник на влошаване на производителността на базата данни. Фрагментацията възниква, когато има много празно пространство на страница с данни (вътрешна фрагментация) или когато логическият ред на страниците в индекса не съвпада с физическия ред на страниците във файла с данни (външно фрагментиране).
Проблеми с производителността, свързани с фрагментацията, най-често се наблюдават при изпълнение на заявки, които извършват сканиране на индекс. Заявките, които извършват търсене на индекс, може да не бъдат засегнати от висока фрагментация на индекса.
Разбиране на типовете фрагментация на индекса на SQL Server
Фрагментация на вътрешния индекс
Вътрешна фрагментация възниква, когато страниците с данни имат твърде много свободно място. Това допълнително пространство се въвежда чрез няколко различни начина:
- SQL Server съхранява данни на 8KB страници. Така че, когато вмъкнете по-малко от 8KB данни в таблица, оставате с празно място на страницата.
- Обратно, ако вмъкнете повече данни, отколкото страницата има място, излишъкът се изпраща на друга страница. Малко вероятно е допълнителните данни да запълнят перфектно следващите страници, така че отново оставате с празно място на страница.
- Празно място на страница с данни се появява и когато данните се изтриват от таблица.
Вътрешната фрагментация причинява предимно проблеми с производителността, когато SQL Server сканира индекс. Производителността се забавя, когато SQL Server трябва да сканира много частично попълнени страници, за да намери данните, които търси.
Фрагментация на външен индекс
Външната фрагментация е резултат от нередност на страниците с данни. Това се причинява от вмъкване или актуализиране на данни до пълни страници. Когато данните се добавят към цяла страница, SQL Server създава разделяне на страница, за да побере допълнителните данни, а новата страница се отделя от оригиналната страница.
Външната фрагментация причинява проблеми с производителността чрез увеличаване на произволния I/O. Когато страниците не са последователни, SQL Server трябва да чете данни от множество места, което отнема повече време, отколкото четенето в ред.
Как да избегнем фрагментирането на индекса на SQL Server
Не е възможно напълно да се предотврати фрагментирането на индекса, но има начини да се сведе до минимум появата му и да се намали ефектът от фрагментацията върху производителността на базата данни. Ето някои правила за избягване на фрагментацията на индекса на SQL Server:
НАПРАВЕТЕ: Изберете клъстерни ключове, които са с постоянно нарастващи стойности или постоянно намаляващи стойности. Това ще намали разделянето на страници, защото когато вмъкнете записи, те ще бъдат поставени в началото или в края на логическата верига от страници.
НЕ: Вмъкване на записи с произволни ключови стойности. Изберете стойностите на статичните ключове, така че след като записът е поставен, той никога да не трябва да се мести и да не излезе от порядък.
НЕ: Актуализирайте записите, за да ги направите по-дълги. Добавянето на записи към индекс по време на актуализация може да изисква SQL Server да изпрати част от данните на нова страница. Това може да доведе до непоследователни листни страници и евентуално до проблеми с производителността.
НЕ: Актуализиране на колоните на индекса. Актуализациите на ключови колони изискват пълно изтриване на ред, последвано от вмъкване на цял ред, използвайки новата стойност на ключа. Ако новият ред е вмъкнат на страница без достатъчно място, ще получите разделяне на страницата.
НАПРАВЕТЕ: Бъдете наясно с функциите, които могат да причинят разделяне на страници. Имайте предвид потенциалните крайни резултати от промяна на всяка функция, която включва индекси. Например, актуализирането на колони с променлива ширина (дори в неключови колони) в клъстериран индекс може да причини разделяне на страници.
ПРАВЕТЕ: Прилагане на подходящи фактори за запълване на индекса. Анализирайте фрагментацията при настройка на коефициента на запълване по подразбиране и коригирайте, ако е необходимо, за да сведете до минимум прекомерната фрагментация при нормално натоварване.
Как да коригирам фрагментацията на индекса на SQL Server
Тъй като предотвратяването на фрагментация в 100 процента от времето е невъзможно, важно е да знаете как да коригирате фрагментацията на индекса на SQL Server, ако производителността страда.
Преди да решите как да подходите към проблема с фрагментацията на индекса на SQL Server, първо трябва да определите колко обширен проблем се справяте.
Най-доброто място да започнете е да използвате sys.dm_db_index_physical_stats DMF, за да анализирате нивото на фрагментация на вашите индекси. След като разберете колко обширна е фрагментацията на индекса, можете да начертаете плана си за атака с едно от трите решения:повторно изградете индекса, реорганизирайте индекса или не правите нищо.
Повторно изграждане: Възстановете индекси, когато фрагментацията достигне повече от 30 процента.
Реорганизиране: Реорганизирайте индекси с между 11-30 процента фрагментация.
Игнориране: Нива на фрагментация от 10 процента или по-малко не трябва да представляват проблем с производителността, така че не е нужно да правите нищо.
Фрагментацията на индекса на SQL Server е неизбежна, но можете да сведете до минимум отрицателните ефекти от фрагментацията върху производителността на базата данни. Следвайте няколко прости най-добри практики и бъдете в крак с планираната поддръжка, за да смекчите всички големи проблеми с производителността, свързани с фрагментацията.