Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Sql2000, реиндексация  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
Добрый день, попросили тут помочь со старой базой на sql2000 (тупит и зависает), по коду, что смог оптимизировал, возник вопрос с обслуживанием
Раз в неделю у них выполнялось
sp_msforeachtable N'DBCC DBREINDEX (''?'')'

Хотел, заменить на распространенный скрипт, который использовали наши админы для sql2005 (REINDEX не все подряд, а в зависимости от фрагментации REORGANIZE или REBUILD).
Данный скрипт валится на начальной выборке
SELECT *  
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'SAMPLED') --with(nolock)
WHERE  index_id > 0 AND avg_fragmentation_in_percent > 5.0; 


Line 3: Incorrect syntax near '('.

я так понимаю, что вместо
 dm_db_index_physical_stats
в 2000й версии использовалось что-то другое, но гугление не помогло.

никто не кинет ссылку на нужный скрипт, для 2000й версии?
Или в принципе, можно не заморачиваться, и оставить исходный вариант?
15 июл 14, 16:00    [16307563]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
StarikNavy, в справке по DBCC SHOWCONTIG есть скрипт
15 июл 14, 16:03    [16307589]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
Shakill,

cпасибо! чувствовал, что рядом что-то
15 июл 14, 17:16    [16308185]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
Shakill,

можно еще разок спросить. вроде разобрался, но смущает следующее:

справка по DBCC SHOWCONTIG, при логической фрагментации >30, просто делаем INDEXDEFRAG
SELECT @maxfrag = 30.0;
--выборка
   INSERT INTO #fraglist 
   EXEC ('DBCC SHOWCONTIG…'
..
  SELECT ObjectName, ObjectId, IndexId, LogicalFrag
   FROM #fraglist
   WHERE LogicalFrag >= @maxfrag
      AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0;
DECLARE indexes CURSOR FOR
   SELECT ObjectName, ObjectId, IndexId, LogicalFrag
   FROM #fraglist
…
--курсор
WHILE @@FETCH_STATUS = 0
BEGIN
   SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ',
       ' + RTRIM(@indexid) + ')';
   EXEC (@execstr);


в найденном скрипте для sql2005, наоборот, если логическая фрагментация < 30, то делаем
INDEX … REORGANIZE (если не изменяет память эквивалентно INDEXDEFRAG),
но зато если > 30 то уже выполняется перестроение индекса ALTER INDEX … REBUILD (эквивалентно опять же DBREINDEX)
--выборка
SELECT
     index_id AS indexid,
    ...
    ,avg_fragmentation_in_percent AS frag,
	(select Name from sysobjects (nolock) where sysobjects.id = object_id) as tableName,
	(select Name from sysobjects (nolock) where sysobjects.id = index_id) as indexName
INTO #work_to_do
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED')
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;
...
--курсор
DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do order by tableName;
...
IF @frag < 30.0
            SET @command = N'ALTER INDEX … REORGANIZE';
        IF @frag >= 30.0
            SET @command = N'ALTER INDEX … REBUILD';
        IF @partitioncount > 1
            SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));
EXEC (@command);


Проверил, на парочке индексов, обе операции (REORGANIZE,REBUILD) приводят к существенному снижению "логической фрагментации". Понимаю, что скорей всего надо смотреть еще параметры, но из так сказать, из БестПрактикс, не подскажете - как оптимальнее: взять вариант от 2005, с частичным перестроением тех индексов, у кого LogicalFrag > 30? Или задать другой критерий?

База используется 24/7, а выполнение
sp_msforeachtable N'DBCC DBREINDEX (''?'')'
ведет к полному ступору на 2 часа
16 июл 14, 13:28    [16312134]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
StarikNavy,

помоему все таки вы что-то уверенно путаете .
MSSQL 2000
Не было вроде у 2000 никаких alter index
16 июл 14, 13:35    [16312184]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
Visibus
Member

Откуда:
Сообщений: 32
StarikNavy,

Если БД используется в режиме 24/7, то кроме как дефрагментации ничего не сделаешь.
Или выделять технологическое окно и выполнять реиндекс раз в неделю/месяц/год/век ), в остальные дни
анализировать индексы на предмет дефрагментации и выполнять вышеприведенным скриптом дефрагментацию.
16 июл 14, 13:44    [16312234]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
Maxx
StarikNavy,
Не было вроде у 2000 никаких alter index


видимо плохо объяснил, для 2000 два варианта
DBCC DBREINDEX
DBCC INDEXDEFRAG

путаюсь (сомневаюсь) при каких параметрах выполнять то или другое
16 июл 14, 13:59    [16312341]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
StarikNavy
Maxx
StarikNavy,
Не было вроде у 2000 никаких alter index


видимо плохо объяснил, для 2000 два варианта
DBCC DBREINDEX
DBCC INDEXDEFRAG

путаюсь (сомневаюсь) при каких параметрах выполнять то или другое
Если позволяют объемы/время/производительность -- делайте ребилд всего. Если не позволяет, делайте ребилд только того, что надо и когда надо.

Дефрагментация -- странный процесс с сомнительным результатом. Если, конечно, скан у вас не превалирующий способ доступа к данным.
16 июл 14, 14:03    [16312365]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
Visibus
StarikNavy,

Если БД используется в режиме 24/7, то кроме как дефрагментации ничего не сделаешь.

ну то есть раз в неделю, для LogicalFrag >=30 делаем DBCC INDEXDEFRAG
а раз в месяц пытаемся, для те же LogicalFrag >=30 сделать DBCC DBREINDEX

нормально?

просто поддержкой БД почти не занимался
16 июл 14, 14:04    [16312383]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
Гавриленко Сергей Алексеевич
Если позволяют объемы/время/производительность -- делайте ребилд всего. Если не позволяет, делайте ребилд только того, что надо и когда надо.
.

получается что не позволяют
вот и пытаюсь понять как раз критерий "только того что надо"
16 июл 14, 14:06    [16312393]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А проапгрейдится на версию сервера повыше, чтобы были онлайн-ребилды?
16 июл 14, 14:09    [16312410]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Фрагментация индексов не такое уж зло, гораздо хуже - это устаревшие статистики.
16 июл 14, 14:11    [16312421]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
StarikNavy
Visibus
StarikNavy,

Если БД используется в режиме 24/7, то кроме как дефрагментации ничего не сделаешь.

ну то есть раз в неделю, для LogicalFrag >=30 делаем DBCC INDEXDEFRAG
а раз в месяц пытаемся, для те же LogicalFrag >=30 сделать DBCC DBREINDEX

нормально?

просто поддержкой БД почти не занимался


возможно нормально , но проверьте после дефрагментации, изменится ли...
16 июл 14, 14:17    [16312457]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
Гавриленко Сергей Алексеевич
А проапгрейдится на версию сервера повыше, чтобы были онлайн-ребилды?


в планах, но пока нет возможности :(

Владислав Колосов
Фрагментация индексов не такое уж зло, гораздо хуже - это устаревшие статистики.

раз в сутки:
exec sp_msforeachtable N'UPDATE STATISTICS ? WITH FULLSCAN'


Winnipuh
после DBCC INDEXDEFRAG для пары случайного выбранного индекса,
LogicalFragmentation снижается, но иногда всего на несколько процентов (с 40 до 30)
----
еще раз всем спасибо!
16 июл 14, 14:52    [16312777]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
StarikNavy
после DBCC INDEXDEFRAG для пары случайного выбранного индекса,
LogicalFragmentation снижается, но иногда всего на несколько процентов (с 40 до 30)


для мелких таблиц дефрагментация не нужна
16 июл 14, 15:14    [16312952]     Ответить | Цитировать Сообщить модератору
 Re: Sql2000, реиндексация  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
Shakill,

да, кстати, согласен, в принципе тогда размер таблицы можно еще подтягивать
16 июл 14, 15:30    [16313098]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить