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

Откуда: Киев
Сообщений: 18
Привет
Не могу понять как сделать запрос один . В написании скриптов я не сильна .
анализирую все таблица на партиционирования в бд с помощью запроса
Select i.name
, i.index_id
, p.partition_number
, p.rows
From sys.partitions As p
Join sys.indexes As i
On p.object_id = i.object_id
And p.index_id = i.index_id
Where p.object_id = object_id('orders')
Order By i.index_id, p.partition_number;
Как сделать запрос
Для каждой парции проверяет фрагментацию индексов
Если фрагментация большая, то фрагментирует в online, если не возможен online то в offline
Подскажите как написать правельнно может подобное что то есть у кого то.

спасибо
3 окт 13, 15:51    [14919411]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Sveta_dba
может подобное что то есть у кого то.

Есть у первоисточника: http://technet.microsoft.com/en-us/library/ms188917.aspx , пример D.
3 окт 13, 16:19    [14919706]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
Sveta_dba
Member

Откуда: Киев
Сообщений: 18
Гость333,
Так это скрипт по всем индексам работает . а мне надо только по партиционным
Или я что то не так поняла ?
3 окт 13, 16:34    [14919824]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Sveta_dba
Так это скрипт по всем индексам работает

Да, по всем.

Sveta_dba
а мне надо только по партиционным

Ну добавьте туда соответствующий фильтр.
3 окт 13, 16:43    [14919886]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
Sveta_dba
Member

Откуда: Киев
Сообщений: 18
Гость333, спасибо за подсказку но что с фильтром не получается не пойму .
не могли бы вы помочь
3 окт 13, 17:10    [14920063]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
Гость333
Member

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

Индекс является секционированным, если ему соответствует более чем одна запись в системном представлении sys.partitions.
Исходя из этого, можно добавить фильтр в запрос формирования таблицы #work_to_do, чтобы туда попали только фрагментированные секционированные индексы:
SELECT
    s.object_id AS objectid,
    s.index_id AS indexid,
    s.partition_number AS partitionnum,
    s.avg_fragmentation_in_percent AS frag
INTO #work_to_do
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, 'LIMITED') s
     INNER JOIN
     (  SELECT object_id, index_id
        FROM sys.partitions
        GROUP BY object_id, index_id
        HAVING COUNT(*) > 1
     ) t ON t.object_id = s.object_id AND t.index_id = s.index_id     
WHERE s.avg_fragmentation_in_percent > 10.0 AND s.index_id > 0;

Весь остальной скрипт останется неизменным.

Либо, что будет более трудозатратно по написанию, но быстрее по времени выполнения — сделать курсор по секционированным индексам, и вызывать sys.dm_db_index_physical_stats не один раз перед циклом для всех индексов, а внутри цикла, "точечно" для каждого индекса. Всё-таки sys.dm_db_index_physical_stats — операция, сильно жадная до дисковых ресурсов, и прогонять её на заведомо ненужных индексах довольно накладно.
3 окт 13, 17:31    [14920197]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
Sveta_dba
Member

Откуда: Киев
Сообщений: 18
Гость333, Я поняла спасибо большое . )
3 окт 13, 17:51    [14920346]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
Работаю за спасибо
Member

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

+ офф

Светлана, скажите пожалуйста, можно даже в личку. Как у вас получилось устроиться на работу DBA? У меня ничего не выходит, хотя за плечами нехилый опыт разработки ПО/БД. И чутку администрирование БД + неплохое знание теории администрирования. Структур индексов/блоков/транзакшн логов и т. п..


Как вы это сделали?
3 окт 13, 18:07    [14920474]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
Sveta_dba
Member

Откуда: Киев
Сообщений: 18
Работаю за спасибо,
Не унывайте у Вас всё получится верте в себя .
Может поменяйте стратегию поиска . Переделайте резюме под работодателя .
4 окт 13, 12:53    [14923364]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
Sveta_dba
Member

Откуда: Киев
Сообщений: 18
Sveta_dba,
что то не выполняется скрипт пишит ERROR ENCOUNTERED
где затык не понимаю
BEGIN TRY
BEGIN TRAN



SET NOCOUNT ON;

DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @partitioncount bigint;
DECLARE @schemaname nvarchar(130);
DECLARE @objectname nvarchar(130);
DECLARE @indexname nvarchar(130);
DECLARE @partitionnum bigint;
DECLARE @partitions bigint;
DECLARE @frag float;
DECLARE @pagecount int;
DECLARE @command nvarchar(4000);

DECLARE @page_count_minimum smallint
SET @page_count_minimum = 1

DECLARE @fragmentation_minimum float
SET @fragmentation_minimum = 10.0


SELECT
s.object_id AS objectid,
s.index_id AS indexid,
s.partition_number AS partitionnum,
s.avg_fragmentation_in_percent AS frag
INTO #work_to_do
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, 'LIMITED') s
INNER JOIN
( SELECT object_id, index_id
FROM sys.partitions
GROUP BY object_id, index_id
HAVING COUNT(*) > 1
) t ON t.object_id = s.object_id AND t.index_id = s.index_id
WHERE s.avg_fragmentation_in_percent > 10.0 AND s.index_id > 0;

DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do;
OPEN partitions;

WHILE (1=1)
BEGIN;
FETCH NEXT
FROM partitions
INTO @objectid, @indexid, @partitionnum, @frag, @pagecount;

IF @@FETCH_STATUS < 0 BREAK;

SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)
FROM sys.objects AS o
JOIN sys.schemas as s ON s.schema_id = o.schema_id
WHERE o.object_id = @objectid;

SELECT @indexname = QUOTENAME(name)
FROM sys.indexes
WHERE object_id = @objectid AND index_id = @indexid;

SELECT @partitioncount = count (*)
FROM sys.partitions
WHERE object_id = @objectid AND index_id = @indexid;

SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';

IF @partitioncount > 1
SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));

EXEC (@command);

PRINT N'Rebuilding index ' + @indexname + ' on table ' + @objectname;
PRINT N' Fragmentation: ' + CAST(@frag AS varchar(15));
PRINT N' Page Count: ' + CAST(@pagecount AS varchar(15));
PRINT N' ';
END;

-- Close and deallocate the cursor.
CLOSE partitions;
DEALLOCATE partitions;

-- Drop the temporary table.
DROP TABLE #work_to_do;
COMMIT TRAN

END TRY
BEGIN CATCH
ROLLBACK TRAN
PRINT 'ERROR ENCOUNTERED'
END CATCH

хотя партишин есть


objectid indexid partitionnum frag
----------- ----------- ------------ ----------------------
1575676661 2 2 17,3913043478261
1575676661 2 3 26,0869565217391
1575676661 2 4 13,0434782608696
1575676661 2 6 30
Прошу помочь .
7 окт 13, 15:16    [14934412]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Sveta_dba
BEGIN TRAN

А это для чего?

Sveta_dba
BEGIN CATCH
ROLLBACK TRAN
PRINT 'ERROR ENCOUNTERED'
END CATCH

SQL Server, в случае ошибки, выдаёт информативное сообщение. Которое вы выкидываете и заменяете на совершенно неинформативное 'ERROR ENCOUNTERED'. Естественно, по такому тексту невозможно определить причину ошибки.

Для получения текста ошибки в блоке CATCH существует функция ERROR_MESSAGE().

Хотя в данном скрипте не нужны ни транзакция, ни блок TRY-CATCH.
7 окт 13, 15:31    [14934503]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
не, ну куда все же русский катит
Guest
Работаю за спасибо
Sveta_dba,

+ офф

Светлана, скажите пожалуйста, можно даже в личку. Как у вас получилось устроиться на работу DBA? У меня ничего не выходит, хотя за плечами нехилый опыт разработки ПО/БД. И чутку администрирование БД + неплохое знание теории администрирования. Структур индексов/блоков/транзакшн логов и т. п..


Как вы это сделали?


+ офф
Работаю за спасибо,
лучше уж за спасибо, чем...
->правельнно, верте в себя, пишит

"В написании скриптов я не сильна"
не скромничайте. Ваша "несильность" куда многопрофильнее.
7 окт 13, 15:41    [14934577]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
Sveta_dba
Member

Откуда: Киев
Сообщений: 18
Гость333,
так отрабатывает но фрагминтация индексов остается таким же .

--BEGIN TRY
--BEGIN TRAN



SET NOCOUNT ON;

DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @partitioncount bigint;
DECLARE @schemaname nvarchar(130);
DECLARE @objectname nvarchar(130);
DECLARE @indexname nvarchar(130);
DECLARE @partitionnum bigint;
DECLARE @partitions bigint;
DECLARE @frag float;
DECLARE @pagecount int;
DECLARE @command nvarchar(4000);

DECLARE @page_count_minimum smallint
SET @page_count_minimum = 1

DECLARE @fragmentation_minimum float
SET @fragmentation_minimum = 10.0


SELECT
s.object_id AS objectid,
s.index_id AS indexid,
s.partition_number AS partitionnum,
s.avg_fragmentation_in_percent AS frag
INTO #work_to_do
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, 'LIMITED') s
INNER JOIN
( SELECT object_id, index_id
FROM sys.partitions
GROUP BY object_id, index_id
HAVING COUNT(*) > 1
) t ON t.object_id = s.object_id AND t.index_id = s.index_id
WHERE s.avg_fragmentation_in_percent > 10.0 AND s.index_id > 0;

DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do;
OPEN partitions;

WHILE (1=1)
BEGIN;
--FETCH NEXT
--FROM partitions
--INTO @objectid, @indexid, @partitionnum, @frag, @pagecount;

IF @@FETCH_STATUS < 0 BREAK;

SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)
FROM sys.objects AS o
JOIN sys.schemas as s ON s.schema_id = o.schema_id
WHERE o.object_id = @objectid;

SELECT @indexname = QUOTENAME(name)
FROM sys.indexes
WHERE object_id = @objectid AND index_id = @indexid;

SELECT @partitioncount = count (*)
FROM sys.partitions
WHERE object_id = @objectid AND index_id = @indexid;

SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';

IF @partitioncount > 1
SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10));

EXEC (@command);

PRINT N'Rebuilding index ' + @indexname + ' on table ' + @objectname;
PRINT N' Fragmentation: ' + CAST(@frag AS varchar(15));
PRINT N' Page Count: ' + CAST(@pagecount AS varchar(15));
PRINT N' ';
END;

-- Close and deallocate the cursor.
CLOSE partitions;
DEALLOCATE partitions;

-- Drop the temporary table.
DROP TABLE #work_to_do;
--COMMIT TRAN

--END TRY
--BEGIN CATCH
--ROLLBACK TRAN
--PRINT 'ERROR ENCOUNTERED'
--END CATCH
7 окт 13, 15:59    [14934725]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Sveta_dba
так отрабатывает

Сомневаюсь. Бесконечный цикл не может "отработать".
7 окт 13, 16:27    [14934977]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
Гость333
Sveta_dba
так отрабатывает

Сомневаюсь. Бесконечный цикл не может "отработать".


- ну вы же коммунист (зачернуто) DBA!
- и пулемет (зачеркнуто) бесконечный цикл застрочил снова!
7 окт 13, 16:56    [14935243]     Ответить | Цитировать Сообщить модератору
 Re: Помогите подскажите как сделать запрос фрагментация партиционирования в бд  [new]
Sveta_dba
Member

Откуда: Киев
Сообщений: 18
Всем спасибо получилось . )
8 окт 13, 10:34    [14937863]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить