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

Откуда:
Сообщений: 104
Доброе время суток. Нашел в сети скрипт для дефрагментации всех индексов для всех таблиц. - в конце текста. Я закоментировал строку начинающуюся с "Where name not in" и добавил строку "Where name in ('указываю_свою_базу'), вопросы:
1. Будет ли скрипт работать только на указанной БД?
2. Действительно ли это скрипт для дефрагментации индексов? - В написании команд для SQL пока понимаю плохо, а т.к. скрипт выдернут из интернета, хочу лишний раз перепроверить что он деалет.

DECLARE @Database VARCHAR(255)   
DECLARE @Table VARCHAR(255)  
DECLARE @cmd NVARCHAR(500)  
DECLARE @fillfactor INT 

SET @fillfactor = 90 

DECLARE DatabaseCursor CURSOR FOR  
SELECT name FROM master.dbo.sysdatabases   
/* WHERE name NOT IN ('master','msdb','tempdb','model','distribution')   */
WHERE name in ('db_name')
ORDER BY 1  

OPEN DatabaseCursor  

FETCH NEXT FROM DatabaseCursor INTO @Database  
WHILE @@FETCH_STATUS = 0  
BEGIN  

   SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT ''['' + table_catalog + ''].['' + 

table_schema + ''].['' + 
  table_name + '']'' as tableName FROM [' + @Database + '].INFORMATION_SCHEMA.TABLES 
  WHERE table_type = ''BASE TABLE'''   

   -- create table cursor  
   EXEC (@cmd)  
   OPEN TableCursor   

   FETCH NEXT FROM TableCursor INTO @Table   
   WHILE @@FETCH_STATUS = 0   
   BEGIN   

       IF (@@MICROSOFTVERSION / POWER(2, 24) >= 9)
       BEGIN
           -- SQL 2005 or higher command 
           SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + 

CONVERT(VARCHAR(3),@fillfactor) + ')' 
           EXEC (@cmd) 
       END
       ELSE
       BEGIN
          -- SQL 2000 command 
          DBCC DBREINDEX(@Table,' ',@fillfactor)  
       END

       FETCH NEXT FROM TableCursor INTO @Table   
   END   

   CLOSE TableCursor   
   DEALLOCATE TableCursor  

   FETCH NEXT FROM DatabaseCursor INTO @Database  
END  
CLOSE DatabaseCursor   
DEALLOCATE DatabaseCursor


Сообщение было отредактировано: 25 янв 16, 13:57
24 янв 16, 08:37    [18722073]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли работать такой скрипт дефрагментации (перестройки) индексов в БД  [new]
o-o
Guest
вы зачем хватаете то, что не знаете даже, что делает?
если база 1, зачем лепить курсор?
зачем перестраивать индексы *всех таблиц подряд*, да еще и с FF = 90?
вредительство какое-то.
вот у нас есть база DWH, к-ая перезаливается каждую ночь с 0,
индексы все новые, никакой фрагментации.
вот бы пришел любитель перестроений и зафигачил ребилд всего.
пожег ресурсы сервера, практически перезаливая все заново,
да еще и раздув при этом все на 10%.
дают же права некоторым!

К сообщению приложен файл. Размер - 1Kb
24 янв 16, 10:29    [18722161]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли работать такой скрипт дефрагментации (перестройки) индексов в БД  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
guestfreeman
1. Будет ли скрипт работать только на указанной БД?
2. Действительно ли это скрипт для дефрагментации индексов? - В написании команд для SQL пока понимаю плохо, а т.к. скрипт выдернут из интернета, хочу лишний раз перепроверить что он деалет.
1. Да
2. Действительно

Вы лучше не делайте того, что не понимаете.

Поищите лучше скрипт для вывода уровня фрагментации.
Проанализируйте результат, задайте здесь вопросы.
Потом, если всё таки найдётся одна-две таблички, которые нужно дефрагментировать, сделайте этот стейтментом ALTER INDEX ... REBUILD, без курсоров и скриптов.
Почитайте ещё про статистику, освойте обновление статистики, наверняка будет полезно.

Это будет полезнее для базы, и, главное, для вас. Вам же нужно стать высокооплачиваемым экспертом, а не "эй, скрипт запусти!"?
24 янв 16, 10:58    [18722196]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли работать такой скрипт дефрагментации (перестройки) индексов в БД  [new]
guestfreeman
Member

Откуда:
Сообщений: 104
[quot o-o]вы зачем хватаете то, что не знаете даже, что делает?
....quot]
-Во-первых, не хватаю, а выбираю.
-Во вторых, я поэтому и спросил что делает этот скрипт, на рабочей СУБД его не запускал, только на тестовой в виртуальной машине, но скрипт выполнялся долго, пока ждал результата решил написать на форум
-В-третьих, вы зачем нозите необоснованно (см вышенаписанное, 1,2)? - Учитывая так же то, что я написал что в скриптах пока понимаю плохо, и только учусь?
24 янв 16, 19:30    [18723211]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли работать такой скрипт дефрагментации (перестройки) индексов в БД  [new]
guestfreeman
Member

Откуда:
Сообщений: 104
[quot alexeyvg]
guestfreeman
1. Будет ли скрипт работать только на указанной БД?


Вы лучше не делайте того, что не понимаете.

Поищите лучше скрипт для вывода уровня фрагментации.

Это будет полезнее для базы, и, главное, для вас. Вам же нужно стать высокооплачиваемым экспертом, а не "эй, скрипт запусти!"?


- Alexeyvg, я сначала так и сделал, нашел скрипт, выполнил его на тестовой базе, а он мне вывел список более 30-ти индексов, уровень фрагментации которых больше 50 %, я и подумал, есть ли смысл дефрагментировать каждый отдельно, может лучше найти скрипт, который дефрагментирует все индексы, и пошел по этому пути.
24 янв 16, 19:32    [18723214]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли работать такой скрипт дефрагментации (перестройки) индексов в БД  [new]
o-o
Guest
[quot guestfreeman]
o-o
вы зачем хватаете то, что не знаете даже, что делает?
....quot]
-Во-первых, не хватаю, а выбираю.
-Во вторых, я поэтому и спросил что делает этот скрипт, на рабочей СУБД его не запускал, только на тестовой в виртуальной машине, но скрипт выполнялся долго, пока ждал результата решил написать на форум
-В-третьих, вы зачем нозите необоснованно (см вышенаписанное, 1,2)? - Учитывая так же то, что я написал что в скриптах пока понимаю плохо, и только учусь?

не знаю, что есть "нозить",
но вы пришли в аптеку и спрашиваете: это правда лекарство от поноса?
и толку вам отвечать да/нет, если вы собрались им непонятно что лечить.
вам говорят, если вы не в состоянии прочесть и понять инструкцию по применению,
то хорош во врача играть, плачевно это закончится.
а вы: а в-третьих, я сам и не пил, я соседу дал
-------
дефрагментируйте дальше.
и сервер почаще перегружайте, тоже универсально помогает.
а главное, этим способом даже фильтровать ORDER_BY-ем не придется
24 янв 16, 19:56    [18723279]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли работать такой скрипт дефрагментации (перестройки) индексов в БД  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
guestfreeman
я и подумал, есть ли смысл дефрагментировать каждый отдельно, может лучше найти скрипт, который дефрагментирует все индексы, и пошел по этому пути.
Ну а нужно их дефрагментировать?
Что это вообще за процесс - дефрагментация?
Какие для него требуются ресурсы?
Что он изменит в базе?
Как повлияет на работающих пользователей?

Вот нужно это сначала выяснить.

В принципе, скорее всего, хуже не будет, а будет лучше, если база не испортится, но всё таки я бы не начинал с этого, с запуска скриптов, найдененых по ключевым словам. Работает-же, зачем выполнять какие то непонятные скрипты, если вы сами не понимаете острой необходимости его выполнить?
24 янв 16, 20:15    [18723320]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли работать такой скрипт дефрагментации (перестройки) индексов в БД  [new]
o-o
Guest
alexeyvg

В принципе, скорее всего, хуже не будет, а будет лучше, если база не испортится

он смотрит фрагментацию в одной базе, а ребилд в другой запускает, на вообще другом сервере.
у него 30 индексов с фрагментацией >50%, из-за 30 он делает ребилд *всем*, может быть 1000 из-за 30 ребилдит, раз не дождался окончания.
у этих 30 сколько страниц, может, в каждом по 5?
и стоило вообще все это затевать?
а запустил ребилд чего, может, партицированную таблицу решил оптом отребилдить?
ее может спецом ради ребилда и побили на секции, а он вот подумал, "чего по одному, раз можно все сразу"
любой скрипт в руках неуча с правами может дорого обойтись
24 янв 16, 20:33    [18723368]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли работать такой скрипт дефрагментации (перестройки) индексов в БД  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
o-o
alexeyvg
В принципе, скорее всего, хуже не будет, а будет лучше, если база не испортится

он смотрит фрагментацию в одной базе, а ребилд в другой запускает, на вообще другом сервере.
у него 30 индексов с фрагментацией >50%, из-за 30 он делает ребилд *всем*, может быть 1000 из-за 30 ребилдит, раз не дождался окончания.
у этих 30 сколько страниц, может, в каждом по 5?
и стоило вообще все это затевать?
а запустил ребилд чего, может, партицированную таблицу решил оптом отребилдить?
ее может спецом ради ребилда и побили на секции, а он вот подумал, "чего по одному, раз можно все сразу"
любой скрипт в руках неуча с правами может дорого обойтись
Ну да, может быть и такое...
Я просто вероятности оцениваю.
Для большинства баз, для обслуживания которых менеджерам нестрашно нанимать не-специалиста, от такого скрипта ничего не будет, если, конечно, место не кончится на диске во время ребилда.
Ну а если будет, то заменят и специалиста, и менеджеров :-)
24 янв 16, 23:28    [18723781]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли работать такой скрипт дефрагментации (перестройки) индексов в БД  [new]
DaniilSeryi
Member

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

Если уж перестраивать индексы базы, то только те, что этого требуют. Как их найти? Скрипт Вам в помощь:

SELECT distinct
    QUOTENAME(s.name) + '.' + OBJECT_NAME(p.object_id) as Table_name,
    p.index_id AS indexid,
    sys.indexes.name,
    partition_number AS partitionnum,
    avg_fragmentation_in_percent AS frag,
    'ALTER INDEX [' + sys.indexes.name + '] on ' + s.name + '.' + OBJECT_NAME(p.object_id) + case when avg_fragmentation_in_percent <15 then ' Reorganize' else ' Rebuild' end as 'Run_it'

FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED') as p
inner join sys.indexes 
on p.index_id=sys.indexes.index_id and p.[object_id]=sys.indexes.[object_id]
        inner join sys.objects AS o
        on p.object_id=o.object_id
        inner JOIN sys.schemas as s ON s.schema_id = o.schema_id
WHERE 
avg_fragmentation_in_percent > 5.0 AND
p.index_id > 0;
25 янв 16, 13:43    [18725526]     Ответить | Цитировать Сообщить модератору
 Re: Будет ли работать такой скрипт дефрагментации (перестройки) индексов в БД  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Когда уже всем надоест играть в игру "Кто напишет более убогий скрипт для ребилда индексов"?

SQL Server Index and Statistics Maintenance - Ola Hallengren
26 янв 16, 02:56    [18728596]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить