Имя: Пароль:
1C
 
Индексы 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% фрагментации - перестроить, что ли.