Тази статия споделя важността на индексите в SQL база данни. Освен това предоставя кратък преглед на клъстерираните и неклъстерираните индекси. Освен това в статията се обсъждат причините за повреда в индекса на SQL Server, фактори за идентифициране на повреден индекс и методи за отстраняването му.
Индексите в SQL Server помагат за ускоряване на процеса на извличане на редове от таблица или изглед. Въпреки това, правилният избор на индекси е от решаващо значение за подобряване на производителността на заявката. SQL Server поддържа клъстерирани и неклъстерни индекси. Повредата в някой от тези индекси може да причини забавяне при извличане на редове. Също така може да получите различни или изтрити стойности, докато извличате някои редове. Освен това най-дълго изпълняваните заявки могат да станат дефектни поради повредени индекси на таблици.
Каквато и да е ситуацията, трябва своевременно да поправите повредата в индексите, за да предотвратите засягането на работния процес на базата данни на SQL Server.
Преди да обсъдим методите за отстраняване на повреда в индексите, нека накратко разгледаме клъстерираните и неклъстерираните индекси.
Общ преглед на клъстерирани и неклъстерни индекси
Прилагането на ограничение за първичен ключ към колона в таблица създава клъстериран индекс върху колоната. Клъстериран индекс сортира данните физически и съхранява данните в таблица въз основа на дефинирания си индексен ключ. Тъй като можем да сортираме данните само в един ред, не е възможно да имаме повече от един клъстериран индекс.
Въпреки това, един неклъстериран индекс сортира и съхранява данни отделно от редовете в таблица. По същество това е копие на колони с данни от таблицата, имащи връзки към свързаната таблица. За разлика от клъстерираните индекси, можете да имате един или повече неклъстерирани индекси.
Какво причинява повреда в индекса на SQL Server?
Индексите могат да бъдат силно фрагментирани с течение на времето (поради групови операции по вмъкване, актуализиране или изтриване) и изисква периодична поддръжка. Фрагментираните индекси могат да причинят лоша производителност на заявката и да се повредят. Също така фактори като надграждане на версията на SQL Server, грешка в SQL програмата, внезапно изключване на системата и т.н. могат да доведат до повреда на индекса на SQL Server. По-специално, изпълнението на „сложен израз UPDATE с NOLOCK намек“ върху таблица може да причини неклъстерна повреда на индекса.
Преди да обсъдим методите за поправяне на повреда в индексите на SQL Server, нека да проверим как да идентифицираме повредените индекси.
Как да идентифицираме повреда в индекса на SQL Server?
Можете да определите дали даден индекс е повреден, като използвате следните методи:
- Извлечете редове с различни или изтрити стойности и след това изпълнете команда „ROWID“, за да идентифицирате всички липсващи записи. Можете също да проследите липсващите записи, като проверите регистъра за грешки в SQL.
- Изпълнението на DBCC CHECKDB ще отчете следното съобщение за грешка, ако имате повреден неклъстериран индекс.
Съобщение 2511, ниво 16, състояние 1, ред 31
Грешка в таблицата:ИД на обект 613577224, ИД на индекс 2, ИД на дял 72057594041401344,
идентификационен номер на alloc unit 72057594047037440 (тип данни в ред).
Ключовете не са в ред на страница (1:264), слотове 2 и 3.
- Ако имате клъстериран индекс, може да получите следното съобщение, показващо грешка:
Сървър:Msg 1902, ниво 16, състояние 3, ред 1
Не може да се създаде повече от един клъстериран индекс в таблица „Име на таблица“. Изхвърлете съществуващия клъстериран индекс „Име на клъстериран индекс“, преди да създадете друг.
Как да поправя повреда в индекса на SQL Server?
Следвайте тези безплатни методи, които можете да използвате, за да поправите повреда в индекса на SQL Server:
Метод 1 – Възстановяване от резервно копие
Независимо дали подозирате корупция в клъстериран или неклъстерен индекс, използвайте архивиране, за да възстановите засегнатите данни, преди да е възникнала повреда.
Възстановяването от резервно копие обаче няма да работи, ако в архива липсват най-новите актуализации. Това дори може да доведе до загуба на данни. В такъв случай опитайте следващия метод.
Метод 2 – Изпускане и пресъздаване на повреден индекс
Забележка: Това работи само за неклъстерирани индекси.
Премахнете целия или конкретен индекс, показващ повреда, като следвате тези стъпки:
- Свържете се със сървърен екземпляр в SQL Server Management Studio (SSMS) .
- В ‘Object Explorer’ прозорец, разгънете базата данни, която съдържа таблицата с повреден индекс.
- Щракнете с десния бутон върху таблицата, изберете „Таблица със скриптове като“ опция, задръжте курсора на мишката над „ПУСНАНЕ И СЪЗДАЙ до“ и кликнете върху Нов редактор на заявки
Ако не успеете да създадете отново повредени индекси, можете да опитате да поправите индексите.
Метод 3 – Поправете SQL базата данни
В краен случай изпълнете командата DBCC CHECKDB с „REPAIR_ALLOW_DATA_LOSS“ за базата данни, която е повредила (клъстериран или неклъстериран) индекс на таблица. Но това може да доведе до загуба на данни. Като алтернативно решение опитайте да използвате инструмент за ремонт на SQL като Stellar Repair за MS SQL. Инструментът помага за ремонт на файлове на база данни (.mdf и .ndf) и възстановява индекси, изгледи, съхранени процедури и всички други компоненти. Можете да импортирате възстановените индекси и други обекти на база данни директно в жива или нова база данни.
Изтеглете демо версията на софтуера за ремонт на база данни SQL, за да прегледате възстановимите индекси, преди да запазите поправения файл.
Заключение
Ако подозирате корупция в индекс, използвайте факторите, описани в статията, за да определите дали индексът е повреден или не. Освен това проверете възможните причини за повреда на индекса на SQL Server и методите за отстраняване на повреда. Методите включват възстановяване на база данни от архивиране, премахване и пресъздаване на индексите и поправка на базата данни и възстановяване на всички нейни компоненти. Можете също така да обмислите използването на инструмент за ремонт на SQL, за да коригирате повредените клъстерирани и неклъстерирани SQL индекси и да възстановите недостъпни обекти на база данни.