Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / После перестроения индексов фрагментация остается / 16 сообщений из 16, страница 1 из 1
04.01.2018, 10:49
    #39579233
Bigzone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После перестроения индексов фрагментация остается
Добрый день.
На БД 30Гб
скриптом смотрю фрагментацию индексов на таблицах показывает 200 таблиц где фрагментация более 30%


Далее выполняю скрипт по перестроению индексов.
пример ниже.
после проверяю и ситуация с фрагментацией не меняется.
SQL2012 подскажите, что на это может влиять?
также выборочно на таблицах стредствами SQL смотрел фрагментацию индексов и пробовал перестроить и также % фрагментации не меняется к примеру как был 80% так и остается.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
DECLARE @SQL NVARCHAR(MAX)

DECLARE cur CURSOR LOCAL READ_ONLY FORWARD_ONLY FOR
	SELECT '
	ALTER INDEX [' + i.name + N'] ON [' + SCHEMA_NAME(o.[schema_id]) + '].[' + o.name + '] ' +
		CASE WHEN s.avg_fragmentation_in_percent > 30
			THEN 'REBUILD WITH (SORT_IN_TEMPDB = ON)'
			ELSE 'REORGANIZE'
		END + ';'
	FROM (
		SELECT 
			  s.[object_id]
			, s.index_id
			, avg_fragmentation_in_percent = MAX(s.avg_fragmentation_in_percent)
		FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) s
		WHERE s.page_count > 128 -- > 1 MB
			AND s.index_id > 0 -- <> HEAP
			AND s.avg_fragmentation_in_percent > 5
		GROUP BY s.[object_id], s.index_id
	) s
	JOIN sys.indexes i WITH(NOLOCK) ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id
	JOIN sys.objects o WITH(NOLOCK) ON o.[object_id] = s.[object_id]

OPEN cur

FETCH NEXT FROM cur INTO @SQL

WHILE @@FETCH_STATUS = 0 BEGIN

	EXEC sys.sp_executesql @SQL

	FETCH NEXT FROM cur INTO @SQL
	
END 

CLOSE cur 
DEALLOCATE cur;
...
Рейтинг: 0 / 0
04.01.2018, 11:23
    #39579249
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После перестроения индексов фрагментация остается
Bigzoneпоказывает 200 таблиц где фрагментация более 30%Размером в 1 страницу?
...
Рейтинг: 0 / 0
04.01.2018, 12:01
    #39579270
Bigzone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После перестроения индексов фрагментация остается
да
...
Рейтинг: 0 / 0
04.01.2018, 13:47
    #39579340
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После перестроения индексов фрагментация остается
Bigzoneда
Таблица в одну страницу занимает 8 Кбайт ("но это не точно" (с)), а скрипт в условии перебирает только те таблицы, где "WHERE s.page_count > 128 -- > 1 MB"...
...
Рейтинг: 0 / 0
05.01.2018, 04:16
    #39579527
Bigzone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После перестроения индексов фрагментация остается
Большое спасибо (Andy_OLAP)
поменял на
WHERE s.page_count > 0
дефрагментировалось 100 таблиц
осталось еще 160 таблиц, что еще можно попробовать?
...
Рейтинг: 0 / 0
05.01.2018, 07:38
    #39579540
После перестроения индексов фрагментация остается
Bigzone,

попробуй почитать и осмыслить реализацию физического хранения данных в MS SQL Server-е. Чтобы не мучить ни сервер бессмысленными попытками дефрагментации того, что невозможно дефрагментировать, ни уважаемых форумчан глупыми вопросами о причинах своих неудач...
...
Рейтинг: 0 / 0
05.01.2018, 12:17
    #39579604
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После перестроения индексов фрагментация остается
Bigzoneосталось еще 160 таблиц, что еще можно попробовать?Не смотреть на таблицы, которые занимают одну страницу.

Вы думаете, зря стояло условие "s.page_count > 128 -- > 1 MB"? Думаете, это просто бага в скрипте?

Не мучайте сервер, не дефрагментируйте маленькие таблицы.

Если же начальник говорит "всё равно дефрагментируйте, пусть даже серверу будет хуже", то перестройте кластерные индексы.
...
Рейтинг: 0 / 0
05.01.2018, 12:59
    #39579635
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После перестроения индексов фрагментация остается
BigzoneБольшое спасибо (Andy_OLAP)
поменял на
WHERE s.page_count > 0
дефрагментировалось 100 таблиц
осталось еще 160 таблиц, что еще можно попробовать?

Зачем вы так агрессивно пытаетесь дефрагментировать всё, что видите?
Цель?
...
Рейтинг: 0 / 0
05.01.2018, 13:02
    #39579638
xenix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После перестроения индексов фрагментация остается
256k,
авторЗачем вы так агрессивно пытаетесь дефрагментировать всё, что видите?
Цель?

Шоб красиво
...
Рейтинг: 0 / 0
05.01.2018, 13:24
    #39579652
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После перестроения индексов фрагментация остается
256kBigzoneБольшое спасибо (Andy_OLAP)
поменял на
WHERE s.page_count > 0
дефрагментировалось 100 таблиц
осталось еще 160 таблиц, что еще можно попробовать?

Зачем вы так агрессивно пытаетесь дефрагментировать всё, что видите?
Цель?Начальник сказал?
...
Рейтинг: 0 / 0
09.01.2018, 08:56
    #39580818
Bigzone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После перестроения индексов фрагментация остается
либо как исключить таблицы из результат запроса который показывает таблицы к переиндексации
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DECLARE @db_name varchar(50) = N'db_name',
                @table_name varchar(250) = N'db_name.dbo.tbl_name'

SELECT  IndStat.database_id, 
                IndStat.object_id, 
                QUOTENAME(s.name) + '.' + QUOTENAME(o.name) AS [object_name], 
                IndStat.index_id, 
                QUOTENAME(i.name) AS index_name,
                IndStat.avg_fragmentation_in_percent,
                IndStat.partition_number, 
                (SELECT count (*) FROM sys.partitions p
                        WHERE p.object_id = IndStat.object_id AND p.index_id = IndStat.index_id) AS partition_count 
FROM sys.dm_db_index_physical_stats
    (DB_ID(), NULL, NULL, NULL , 'LIMITED') AS IndStat
        INNER JOIN sys.objects AS o ON (IndStat.object_id = o.object_id)
        INNER JOIN sys.schemas AS s ON s.schema_id = o.schema_id
        INNER JOIN sys.indexes i ON (i.object_id = IndStat.object_id AND i.index_id = IndStat.index_id)
WHERE IndStat.avg_fragmentation_in_percent > 10 AND IndStat.index_id > 0
...
Рейтинг: 0 / 0
15.01.2018, 06:08
    #39584127
Bigzone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После перестроения индексов фрагментация остается
Запустил стандартный SQL отчет "Физическая статистика индекса" на БД он также показывает рекомендации перестроить либо реорганизовать.
Значит получается скрипт не все делает
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
DECLARE @SQL NVARCHAR(MAX)

DECLARE cur CURSOR LOCAL READ_ONLY FORWARD_ONLY FOR
	SELECT '
	ALTER INDEX [' + i.name + N'] ON [' + SCHEMA_NAME(o.[schema_id]) + '].[' + o.name + '] ' +
		CASE WHEN s.avg_fragmentation_in_percent > 30
			THEN 'REBUILD WITH (SORT_IN_TEMPDB = ON)'
			ELSE 'REORGANIZE'
		END + ';'
	FROM (
		SELECT 
			  s.[object_id]
			, s.index_id
			, avg_fragmentation_in_percent = MAX(s.avg_fragmentation_in_percent)
		FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) s
		WHERE s.page_count > 128 -- > 1 MB
			AND s.index_id > 0 -- <> HEAP
			AND s.avg_fragmentation_in_percent > 5
		GROUP BY s.[object_id], s.index_id
	) s
	JOIN sys.indexes i WITH(NOLOCK) ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id
	JOIN sys.objects o WITH(NOLOCK) ON o.[object_id] = s.[object_id]

OPEN cur

FETCH NEXT FROM cur INTO @SQL

WHILE @@FETCH_STATUS = 0 BEGIN

	EXEC sys.sp_executesql @SQL

	FETCH NEXT FROM cur INTO @SQL
	
END 

CLOSE cur 
DEALLOCATE cur;
...
Рейтинг: 0 / 0
15.01.2018, 10:00
    #39584195
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После перестроения индексов фрагментация остается
Bigzone, уважаемый в той статье откуда Вы брали этот скрипт внизу все написано. Ограничение в 1Мб вполне нормально и чуть не понятна суть Ваших проблем.
...
Рейтинг: 0 / 0
15.01.2018, 10:04
    #39584198
Bigzone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После перестроения индексов фрагментация остается
Из запроса убрал условия ограничения по перестроению индекса.
все равно остаются более 150 таблиц и фрагментироваными индексами. И стандартный отчет SQL рекомендует их перестроить.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
DECLARE @SQL NVARCHAR(MAX)

DECLARE cur CURSOR LOCAL READ_ONLY FORWARD_ONLY FOR
	SELECT '
	ALTER INDEX [' + i.name + N'] ON [' + SCHEMA_NAME(o.[schema_id]) + '].[' + o.name + '] ' +
		CASE WHEN s.avg_fragmentation_in_percent > 30
			THEN 'REBUILD WITH (SORT_IN_TEMPDB = ON)'
			ELSE 'REORGANIZE'
		END + ';'
	FROM (
		SELECT 
			  s.[object_id]
			, s.index_id
			, avg_fragmentation_in_percent = MAX(s.avg_fragmentation_in_percent)
		FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) s
		GROUP BY s.[object_id], s.index_id
	) s
	JOIN sys.indexes i WITH(NOLOCK) ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id
	JOIN sys.objects o WITH(NOLOCK) ON o.[object_id] = s.[object_id]

OPEN cur

FETCH NEXT FROM cur INTO @SQL

WHILE @@FETCH_STATUS = 0 BEGIN

	EXEC sys.sp_executesql @SQL

	FETCH NEXT FROM cur INTO @SQL
	
END 

CLOSE cur 
DEALLOCATE cur;
...
Рейтинг: 0 / 0
15.01.2018, 10:09
    #39584201
После перестроения индексов фрагментация остается
Bigzone,

ты как Партос из мушкетеров, что ли - "дерусь, потому что - дерусь"(с)?
цель всего этого действия какая? красивые показатели в отчете?
Реальные проблемы есть, которыми можно руки занять?
Или всё остальное уже решено?
Если таблица маленькая и хранится в смешанных экстентах - ты её хоть зафрагментируйся - раньше дырку протрешь на блине диска, чем избавишься от фрагментации...
...
Рейтинг: 0 / 0
15.01.2018, 10:11
    #39584202
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После перестроения индексов фрагментация остается
Bigzone,

вам уже с десяток раз ответили. Для небольших таблиц от фрагментации не измбавиться, ну или удалите индексы :)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / После перестроения индексов фрагментация остается / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]