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

Откуда:
Сообщений: 710
Вообщем есть задача произвести скриптом дефрагментацию всех индексов конкретной таблицы, только одной.
BOL говорит по синтаксису DBCC INDEXDEFRAG >>> index_name | index_id
Имя или идентификатор индекса, подлежащего дефрагментации. Если этот аргумент не указан, дефрагментируются все индексы заданной таблицы или представления. Имена индексов должны соответствовать правилам для идентификаторов.

На практике строка DBCC INDEXDEFRAG (zip_work,"dbo.coitem",IX_coitem_item) выполняется, если вместо конкретного имени индекса ничего не писать DBCC INDEXDEFRAG (zip_work,"dbo.coitem"), то сообщение An incorrect number of parameters was given to the DBCC statement. Если DBCC INDEXDEFRAG (zip_work,"dbo.coitem",,) , то Incorrect syntax near ','.

Что ему не нравится ? Как правильно дефрагментировать индексы конкретной таблицы ? Скрипт с курсором к сожалению написать не могу ибо не сведущ в делах этих...помогите плиз !!! Google упорно предлагает только все таблицы, а не конкретную :(
30 авг 11, 15:13    [11201433]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35384
Блог
alter index all on таблица REBUILD
30 авг 11, 15:17    [11201469]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Критик
alter index all on таблица REBUILD

ой сорри извиняюсь MS SQL 2000 Sp4...так что никак не получиться :(
30 авг 11, 15:22    [11201508]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5116
DBCC INDEXDEFRAG (имя_базы, "dbo.имя_таблицы")
30 авг 11, 15:27    [11201553]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Дедушка
DBCC INDEXDEFRAG (имя_базы, "dbo.имя_таблицы")

An incorrect number of parameters was given to the DBCC statement.
Я же писал...что и является странным :(
30 авг 11, 15:31    [11201575]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
iljy
Member

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

странности резко исчезают, если читать документацию.
http://msdn.microsoft.com/en-us/library/aa258286(v=sql.80).aspx
30 авг 11, 15:49    [11201696]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Синтаксис

DBCC INDEXDEFRAG
(
{ database_name | database_id | 0 }
, { table_name | table_id | view_name | view_id }
[ , { index_name | index_id } [ , { partition_number | 0 } ] ]
)
[ WITH NO_INFOMSGS ]


Аргументы
database_name | database_id | 0
База данных, содержащая индекс для дефрагментации. Если указано 0, используется текущая база данных. Имена баз данных должны соответствовать правилам для идентификаторов.

table_name | table_id | view_name | view_id
Таблица или представление, содержащие индекс для дефрагментации. Имена таблиц и представлений должны соответствовать правилам для идентификаторов.

index_name | index_id
Имя или идентификатор индекса, подлежащего дефрагментации. Если этот аргумент не указан, дефрагментируются все индексы заданной таблицы или представления. Имена индексов должны соответствовать правилам для идентификаторов.

partition_number | 0
Номер секции индекса, которую следует дефрагментировать. Если этот аргумент не указан или равен 0, дефрагментируются все секции заданного индекса.

WITH NO_INFOMSGS
Подавляет все информационные сообщения со степенями серьезности от 0 до 10.

Ну вот собственно что там написано, может для 2000SP4 не актуально !!!
30 авг 11, 16:30    [11202058]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
stavgreengo, вы цитируете хелп для более старших версий сервера, об этом в её начале написано. а ссылку на статью для 2000 вам уже привели
30 авг 11, 16:38    [11202126]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Shakill
stavgreengo, вы цитируете хелп для более старших версий сервера, об этом в её начале написано. а ссылку на статью для 2000 вам уже привели

Ну тогда ясно что без курсора не обойтись, вот только как его сделать я незнаю
30 авг 11, 16:55    [11202257]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
stavgreengo
Shakill
stavgreengo, вы цитируете хелп для более старших версий сервера, об этом в её начале написано. а ссылку на статью для 2000 вам уже привели

Ну тогда ясно что без курсора не обойтись, вот только как его сделать я незнаю


можно и без курсора. получаете список индексов нужной таблицы из sys.sysindexes и генерируете объединенный запрос на их реиндекс
например
30 авг 11, 17:24    [11202455]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
stavgreengo
Shakill
stavgreengo, вы цитируете хелп для более старших версий сервера, об этом в её начале написано. а ссылку на статью для 2000 вам уже привели

Ну тогда ясно что без курсора не обойтись, вот только как его сделать я незнаю
Вам обязательно INDEXDEFRAG?

Вот в DBCC DBREINDEX index_name - точно, не обязательный параметр...
30 авг 11, 17:34    [11202515]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
baracs
stavgreengo
пропущено...

Ну тогда ясно что без курсора не обойтись, вот только как его сделать я незнаю
Вам обязательно INDEXDEFRAG?

Вот в DBCC DBREINDEX index_name - точно, не обязательный параметр...

да знаю, но запускать его надо во время работы пользователей, таблица очень тяжёлая, боюсь что они меня не поймут :)
30 авг 11, 17:38    [11202551]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
stavgreengo
да знаю, но запускать его надо во время работы пользователей, таблица очень тяжёлая, боюсь что они меня не поймут :)


это обязательно? сделайте джоб, пускайте его ночью
30 авг 11, 17:41    [11202570]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Shakill
stavgreengo
да знаю, но запускать его надо во время работы пользователей, таблица очень тяжёлая, боюсь что они меня не поймут :)


это обязательно? сделайте джоб, пускайте его ночью

есть такой джоб, но он дефрагментирует все таблицы БД у которых она больше 30%. А по факту ситуации чтобы избавить себя от нытья юзеров "всё тормозит" приходиться дефрагментировать одну увесистую таблицу мануально и обновлять статистику с fullscan, вот этот скрипт и хочу сделать и воткнуть в обеденный перерыв, а то каждый день руками не дело.
30 авг 11, 17:50    [11202625]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
iljy
Member

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

вы занимаетесь ИКД. Если надо действительно решить проблему - сначала ее найдите. У вас точно проблема в фрагментации, причем именно этой таблицы? И почему она так быстро фрагментируется? Может имеет смысл сначала в этом разобраться?
30 авг 11, 17:53    [11202648]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
select 'dbcc indexdefrag (zip_work, coitem,'+i.name+')'
from sysindexes i, sysobjects o
where
o.name='coitem'
and o.id=i.id -- связь между sysindexes и sysobjects
and i.indid between 1 and 254 -- indid=0 зарезервировано для таблицы, 255 - LOB

отрабатывает успешно, но тупо выводит название шапки столбца и всё, что я промохал ?
30 авг 11, 17:59    [11202690]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
iljy
Member

Откуда:
Сообщений: 8711
stavgreengo
select 'dbcc indexdefrag (zip_work, coitem,'+i.name+')'
from sysindexes i, sysobjects o
where
o.name='coitem'
and o.id=i.id -- связь между sysindexes и sysobjects
and i.indid between 1 and 254 -- indid=0 зарезервировано для таблицы, 255 - LOB

отрабатывает успешно, но тупо выводит название шапки столбца и всё, что я промохал ?

А что по вашему оно давно вывести??
30 авг 11, 18:01    [11202708]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
stavgreengo, а скрипт точно выполняете на той базе, где есть таблица с таким именем?
30 авг 11, 18:03    [11202716]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35384
Блог
Если реиндексация все же лечит проблему, то попробуйте (для начала) в обеденный перерыв запускать обновление статистики. Для начала без параметров.
30 авг 11, 18:19    [11202799]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Shakill
stavgreengo, а скрипт точно выполняете на той базе, где есть таблица с таким именем?

точно...на master исполнялась, теперь ситуация такая...запрос выдаёт 106 строк, а мне нужно с 1вой по 18тую и 104тая, как правильно условия подредактировать ?
30 авг 11, 18:28    [11202850]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
iljy
Member

Откуда:
Сообщений: 8711
stavgreengo
Shakill
stavgreengo, а скрипт точно выполняете на той базе, где есть таблица с таким именем?

точно...на master исполнялась, теперь ситуация такая...запрос выдаёт 106 строк, а мне нужно с 1вой по 18тую и 104тая, как правильно условия подредактировать ?

Сколько????? У вас сколько индексов на таблице?????
30 авг 11, 18:33    [11202877]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
iljy
stavgreengo
пропущено...

точно...на master исполнялась, теперь ситуация такая...запрос выдаёт 106 строк, а мне нужно с 1вой по 18тую и 104тая, как правильно условия подредактировать ?

Сколько????? У вас сколько индексов на таблице?????

19ть, в селект индексы попадают с 1го по 18тую запись и почему-то 104тая.
30 авг 11, 18:35    [11202884]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
iljy
Сколько????? У вас сколько индексов на таблице?????


спокойствие, у ТС в выборку ещё и статистики попали
30 авг 11, 18:37    [11202897]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
iljy
Member

Откуда:
Сообщений: 8711
stavgreengo
iljy
пропущено...

Сколько????? У вас сколько индексов на таблице?????

19ть, в селект индексы попадают с 1го по 18тую запись и почему-то 104тая.

У вас сколько таблиц с именем coitem? Используйте функцию object_id:
use Northwind
select 'DBCC INDEXDEFRAG([Northwind],''dbo.Customers'',''' + name + ''')'
from sysindexes
where id = object_id('dbo.Customers')
30 авг 11, 18:38    [11202903]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать простейший скрипт по INDEXDEFRAG  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
stavgreengo
Shakill
stavgreengo, а скрипт точно выполняете на той базе, где есть таблица с таким именем?

точно...на master исполнялась, теперь ситуация такая...запрос выдаёт 106 строк, а мне нужно с 1вой по 18тую и 104тая, как правильно условия подредактировать ?


добавьте условие на таблицу sysindexes: rowcnt > 0
30 авг 11, 18:41    [11202910]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить