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

Откуда:
Сообщений: 21
Есть процедура перестройки индексов в базе:

------------------- Select problematic indexes  -------------------


SET @db_id = DB_ID(); 

DECLARE C1 CURSOR FOR

SELECT 
	 OBJECT_NAME(f.object_id), 
	 i.name, 
	 f.avg_fragmentation_in_percent 
FROM 
     sys.dm_db_index_physical_stats (@db_id, NULL, NULL , NULL, 'LIMITED') f
     JOIN sys.indexes i ON i.object_id = f.object_id AND i.index_id = f.index_id
     JOIN sys.tables t  ON t.object_id = f.object_id 
     LEFT OUTER JOIN sys.dm_db_index_usage_stats s ON s.database_id = f.database_id AND s.object_id = f.object_id AND s.index_id = f.index_id
WHERE 
     f.avg_fragmentation_in_percent > 10.0 
     AND f.index_id > 0 
     AND f.page_count > 0

------------------ Rebuild problematic indexes  ------------------

OPEN C1
FETCH NEXT FROM C1 INTO @TableName, @IndexName, @FragPercent

WHILE (@@fetch_status <> -1)
BEGIN
	IF (@@fetch_status <> -2)
	BEGIN
	    SET @starttime = GETDATE()	   	     
	    EXEC('ALTER INDEX '+@IndexName+ ' ON '+@TableName + ' REBUILD WITH (FILLFACTOR = 90)') 	
	END
	FETCH NEXT FROM C1 INTO @TableName, @IndexName, @FragPercent
END 

CLOSE C1
DEALLOCATE C1

Процедура вылетает с ошибкой:
Cannot find the object "crRequest" because it does not exist or you do not have permissions..

Запускается процедура от юзера члена роли db_owner.
Объект usr.crRequest это таблица.

Помогите пожалуйста с причиной
10 авг 09, 13:12    [7517178]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с перестройкой индекса  [new]
Glory
Member

Откуда:
Сообщений: 104760
vvsql

Объект usr.crRequest это таблица.

А ваш скрипт использует просто crRequest. Разницу понимаете ?
10 авг 09, 13:18    [7517224]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с перестройкой индекса  [new]
vvsql
Member

Откуда:
Сообщений: 21
Спасибо. Как лучше исправить скрипт, чтобы учитывалась схема?
10 авг 09, 14:02    [7517527]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с перестройкой индекса  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33339
Блог
мб это наведет вас на мысль)
select * from sys.schemas

ps зачем в вашем скрипте вот это соединение?
JOIN sys.tables t  ON t.object_id = f.object_id 

Вот так попробуйте, ну и прикрутите сюда схему
-- фрагментированные индексы
SELECT TOP 100
        DatbaseName = DB_NAME()
        ,TableName = OBJECT_NAME(s.[object_id])
        ,IndexName = i.name
        ,i.type_desc
        ,[Fragmentation %] = ROUND(avg_fragmentation_in_percent,2)
        ,page_count
        ,partition_number
        ,'alter index '+i.name+' on '+ OBJECT_NAME(s.[object_id]) + ' REBUILD' + case
                                                                                   when p.data_space_id is not null then ' PARTITION = '+convert(varchar(100),partition_number)
                                                                                   else ''
                                                                                 end [sql]
FROM sys.dm_db_index_physical_stats(db_id(),null, null, null, null) s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id] AND
                            s.index_id = i.index_id
left join sys.partition_schemes p on i.data_space_id = p.data_space_id
WHERE s.database_id = DB_ID() 
      AND i.name IS NOT NULL    -- Ignore HEAP indexes.
    AND OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0
    and page_count > 100
    and avg_fragmentation_in_percent > 10
ORDER BY [Fragmentation %] DESC
10 авг 09, 15:30    [7518112]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с перестройкой индекса  [new]
vvsql
Member

Откуда:
Сообщений: 21
Насчёт связки
JOIN sys.tables t  ON t.object_id = f.object_id 
Действительно непонятно. Скрипт готовый, писал не я.

Изменил на:

------------------- Select problematic indexes  -------------------

SET @db_id = DB_ID(); 

DECLARE C1 CURSOR FOR

SELECT OBJECT_NAME(f.object_id), 
	 i.name, 
	 f.avg_fragmentation_in_percent,
	 sh.name
FROM 
     sys.dm_db_index_physical_stats (@db_id, NULL, NULL , NULL, 'LIMITED') f
     JOIN sys.indexes i ON i.object_id = f.object_id AND i.index_id = f.index_id  
	--JOIN sys.tables t  ON t.object_id = f.object_id 
     LEFT OUTER JOIN sys.dm_db_index_usage_stats s ON s.database_id = f.database_id AND s.object_id = f.object_id AND s.index_id = f.index_id
	 JOIN sys.objects AS o ON o.object_id=f.object_id
	 JOIN sys.schemas as sh ON sh.schema_id = o.schema_id
WHERE 
     f.avg_fragmentation_in_percent > 10.0 
     AND f.index_id > 0 
     AND f.page_count > 0

------------------ Rebuild problematic indexes  ------------------

OPEN C1
FETCH NEXT FROM C1 INTO @TableName, @IndexName, @FragPercent, @schemaname

WHILE (@@fetch_status <> -1)
BEGIN
	IF (@@fetch_status <> -2)
	BEGIN
	    SET @starttime = GETDATE()
		EXEC('ALTER INDEX '+@IndexName+ ' ON '+@schemaname + '.' + @TableName + ' REBUILD WITH (FILLFACTOR = 90)');
		END
	FETCH NEXT FROM C1 INTO @TableName, @IndexName, @FragPercent, @schemaname
END 

CLOSE C1
DEALLOCATE C1

Как прикинуть сколько всё займёт времени, если скрипт не исполнялся и в наличии очень сильная фрагментация...
10 авг 09, 15:51    [7518276]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с перестройкой индекса  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33339
Блог
Скционирование не используете?
Вш скрипт не учитывает его.
Сколько времени займет - неизвестно, и можно крупно папасть)
Например началась перестойка индекса, и тут очень важный пакет начал выполнятся, и т.д.

Так что первое выполнение рекомендую ручками сделать, потом посчитать затраченное время.
10 авг 09, 16:09    [7518414]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с перестройкой индекса  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33339
Блог
кстати, еще скрипт упадет, если имя индекса/таблицы будет с пробелами)
10 авг 09, 16:10    [7518427]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с перестройкой индекса  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5184
vvsql,

сколько примерно займет можно узнать запустив его и в отдельной сессии дернув следующий запрос:

When will my backup / restore / index reorganize finish?
10 авг 09, 17:23    [7518895]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с перестройкой индекса  [new]
vvsql
Member

Откуда:
Сообщений: 21
С секционированием не разбирался :(. Буду надеятся, что в моей ситуации в данный момент можно пропустить.
Пробую перестраивать поиндексно вручную пример:
ALTER INDEX IX_Bridge ON Bridge REBUILD WITH (FILLFACTOR = 90);
Некоторые индексы из начального списка "не уходят". Подскажите пожалуйста, в чём может быть причина?
10 авг 09, 17:23    [7518897]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с перестройкой индекса  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33339
Блог
vvsql
Некоторые индексы из начального списка "не уходят". Подскажите пожалуйста, в чём может быть причина?


причина вот в этом f.page_count > 0
10 авг 09, 17:26    [7518914]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с перестройкой индекса  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33339
Блог
komrad
vvsql,

сколько примерно займет можно узнать запустив его и в отдельной сессии дернув следующий запрос:

When will my backup / restore / index reorganize finish?


мимо) на REBUILD это не работает))
10 авг 09, 17:28    [7518924]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с перестройкой индекса  [new]
vvsql
Member

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

автор
the types of operations that are exposed in the percent_complete and estimated_completion_time are:

BACKUP
RESTORE
ALTER INDEX ... REORGANIZE (not REBUILD)


как я понял, ребилд индекса не покажет...
10 авг 09, 17:29    [7518937]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с перестройкой индекса  [new]
vvsql
Member

Откуда:
Сообщений: 21
Критик,

благодарю за Вашу помощь :)

Хотелось бы понять "физику":

автор
page_count:

Общее количество страниц индекса или данных.

Для индекса — общее количество страниц индекса на текущем уровне сбалансированного дерева в единице распределения IN_ROW_DATA.

Для кучи — общее количество страниц данных в единице распределения IN_ROW_DATA.

Для единиц распределения LOB_DATA или ROW_OVERFLOW_DATA — общее количество страниц в единице распределения.


В моём случае page_count > 0 и индекс, как я понял, не перестраивается. Как кол-во страниц влияет пока не понял :(
10 авг 09, 17:39    [7518985]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с перестройкой индекса  [new]
komrad
Member

Откуда: Msk -> Utrecht
Сообщений: 5184
vvsql
komrad,

автор
the types of operations that are exposed in the percent_complete and estimated_completion_time are:

BACKUP
RESTORE
ALTER INDEX ... REORGANIZE (not REBUILD)


как я понял, ребилд индекса не покажет...


да, сорри, не заметил ...
10 авг 09, 17:41    [7518998]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с перестройкой индекса  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33339
Блог
vvsql,

Тынц почитайте
10 авг 09, 17:46    [7519012]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить