|
Индексы sql, как посмотреть фрагментацию? |
☑ |
0
OldCondom
19.02.20
✎
11:11
|
Развернул базу из бекапа, к кластеру еще не подключал.
Формирую стандартный отчет mssql "Физическое состояние индексов". Получаю, к примеру, по таблице "_Acc28" некластеризованный индекс "_Acc28_ByCode_SR", фрагментация 50%, рекомендация - перестроить.
Выбираю в дереве этот индекс - перестроить. Операция выполнена успешна. Формирую отчет, изменений нет! Те же 50% фрагментации. Такая же ситуация через план обслуживания.
Что не так-то? Как правильно перестраивать/дефрагментировать индексы? Или отчет кривой?
|
|
1
OldCondom
19.02.20
✎
11:16
|
хм, сделал dbcc freeproccache, сейчас отчет формирую заново. Ну хз, может что изменится.
|
|
2
OldCondom
19.02.20
✎
11:26
|
Такс, команда
ALTER INDEX _Acc28_ByCode_SR ON [имябазы].[dbo].[_Acc28] REBUILT ничего не дала. ФРагментация осталась, хотя при перестроении должна быть равна 0.
ALTER INDEX _Acc28_ByCode_SR ON [имябазы].[dbo].[_Acc28] REORGANIZE - фрагментацию убрала.
Что-то я не догоняю
|
|
3
Aleksey
19.02.20
✎
11:33
|
UPDATE STATISTICS делал?
|
|
4
OldCondom
19.02.20
✎
11:36
|
Если не ошибаюсь, делал. С вероятностью в 80%)
|
|
5
OldCondom
19.02.20
✎
11:36
|
Судя по всему тут вырисовывается вопрос, а rebuilt вообще отрабатывает?
|
|
6
trad
19.02.20
✎
12:01
|
на всякий случай, вдруг еще не читал
|
|
7
OldCondom
21.02.20
✎
12:45
|
В общем, либо я не умею смотреть, либо руки не из плеч, но план обслуживания как с реорганизацией, так и перестроением судя по отчету "Физическое состояние индексов" ничего толком не делают. Фрагментация остается.
Отрабатывает ПКМ на индексе, далее реорганизовать или перестроить. Посмотрел, что там за скрипт.
"USE [имя базы]
GO
ALTER INDEX [имя индекса] ON [dbo].[имя таблицы] REORGANIZE WITH ( LOB_COMPACTION = ON )
GO"
Нашел такой скрипт, к умному(с анализом процента фрагментации) он не относится, но хоть что-то. Выполняется схожий скрипт, который по ПКМ, но для всех индексов всех таблиц БД.
"Use имя БД
Declare @TBname nvarchar(255),
@SQL nvarchar(max)
select @TBname = min(TABLE_NAME) from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'
while @TBname is not null
BEGIN
set @SQL='ALTER INDEX ALL ON [' + @TBname + '] REORGANIZE;'
--print @SQL
EXEC SP_EXECUTESQL @SQL
select @TBname = min(TABLE_NAME) from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' and TABLE_NAME > @TBname
END"
|
|
8
OldCondom
21.02.20
✎
12:46
|
Фрагментация исчезла.
Теперь надо над перестроением думать. Как там 1С рекомендует? Более 30% фрагментации - перестроить, что ли.
|
|
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой