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

Откуда:
Сообщений: 10
Есть база 1С на SQL 2000 в которой задвоились индексы по некоторым таблицам. Как правильно удалить все индексы?
7 дек 09, 13:53    [8028634]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36799
Индексы удаляются командой drop index.
7 дек 09, 14:01    [8028707]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
zeek_
Member

Откуда:
Сообщений: 10
Это понятно, но так можно удалять один индекс, а если все.
7 дек 09, 14:34    [8029211]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36799
zeek_
Это понятно, но так можно удалять один индекс, а если все.
Написать команду drop index для каждого.

А вы уверены, что вы хотите удалить все индексы?
7 дек 09, 16:49    [8030543]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
zeek_
Member

Откуда:
Сообщений: 10
Ну не абсолютно все, но многие. Вот есть уже скрипт
declare cur cursor

for 
select t.name, i.name, i.indid

from sysobjects t, sysindexes i

where t.id = i.id
and t.type = 'U'
and i.indid <> 0
and t.name not like 'sys%'
order by t.name, i.name

declare @tname varchar(50), @iname varchar(50), @itype int, @sql nvarchar(500)

open cur

fetch  next from cur into @tname, @iname, @itype

while @@fetch_status = 0
begin
    if @itype = 1
    begin
        select @sql = N'ALTER TABLE ' + @tname  + ' DROP CONSTRAINT ' + @iname
    end
    else
    begin
        select @sql = N'DROP INDEX ' + @tname + '.' + @iname
    end

    print @sql

    exec sp_executesql @sql

   fetch  next from cur into @tname, @iname, @itype

end

close cur
deallocate cur
Но он пишет ошибки типа:
DROP INDEX _1SCONST._WA_Sys_DATE_77BFCB91
Server: Msg 3701, Level 11, State 7, Line 1
Cannot drop the index '_1SCONST._WA_Sys_DATE_77BFCB91', because it does not exist in the system catalog.
7 дек 09, 16:54    [8030584]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
Glory
Member

Откуда:
Сообщений: 104760
sysindexes содержит не только индексы. Но и статистики, например. Для правильной фильтрации используйте INDEXPROPERTY()
7 дек 09, 17:29    [8030900]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
ard_ttt
Guest
Приведенный вами скрипт выбирает не только индексы, но и статистику. Поэтому вы и получили сообщение об ошибке. _WA_Sys_DATE_77BFCB91 - это статистика.
Попробуйте ограничить выборку, например добавив в ограничение where условие AND i.maxirow IS NOT NULL.
7 дек 09, 17:31    [8030935]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
zeek_
Member

Откуда:
Сообщений: 10
ard_ttt, и при maxirow is not null и при maxirow > 0 ,все равно статистика попадает в выборку.
7 дек 09, 17:42    [8031043]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
Glory
Member

Откуда:
Сообщений: 104760
zeek_
ard_ttt, и при maxirow is not null и при maxirow > 0 ,все равно статистика попадает в выборку.

Потому что надо пользоваться документированными методами определения индексов
7 дек 09, 17:45    [8031066]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
ard_ttt
Guest
Я это привел только для примера. А вообще вам надо разобраться что вы хотите делать.
Вам Glory правильно сказал пользоваться INDEXPROPERTY. Читайте BOL.
Например, чтобы убрать статистику добавьте условие AND INDEXPROPERTY(i.id,i.name,'IsStatistics')=0.
7 дек 09, 17:54    [8031131]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
zeek_
Member

Откуда:
Сообщений: 10
DROP INDEX DH607.tDH607
Server: Msg 3708, Level 16, State 3, Line 1
Cannot drop the index 'DH607.tDH607' because it is a system index.
А как системные индексы отсеять?
8 дек 09, 10:47    [8032948]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
ard_ttt
Guest
zeek_ вам нужно:
1. Точно разобраться чего вы хотите и какие индексы хотите удалить, поскольку если вы удалите из базы все индексы, то вряд ли с ней можно будет нормально работать и потом встанет задача восстановления нужных индексов. Вы подумали, как будете решать эту задачу? Может лучше не удалять все индексы одним махом, а разобраться какие именно индексы надо удалять.
2. Если вы все таки решите удалять индексы не вручную, а запросом, то для того чтобы отфильтровать нужные, используйте, в том числе, и функцию INDEXPROPERTY, предварительно почитав описание в BOL. То, что я написал в предыдущем посте это только пример, а не готовое решение.
8 дек 09, 11:27    [8033319]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Если индексы оехали значит база "битая" для начала попробуйте индексы востановить статными средствами dbcc checkdb(basa, repair_rebuild) например
8 дек 09, 14:38    [8035221]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
zeek_
Member

Откуда:
Сообщений: 10
После удаления индексов документа и констант CHECKDB ошибок не показал, но при монопольном входе и восстановлении индексов выдает Native ошибку и CREATE UNIQUE INDEX terminated because a duplicate key was found for index ID 1. Most significant primary key is '1010271'. Что это за ключ такой?
8 дек 09, 14:50    [8035339]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36799
zeek_
После удаления индексов документа и констант CHECKDB ошибок не показал, но при монопольном входе и восстановлении индексов выдает Native ошибку и CREATE UNIQUE INDEX terminated because a duplicate key was found for index ID 1. Most significant primary key is '1010271'. Что это за ключ такой?
Это вы у нас спрашиваете?
8 дек 09, 14:53    [8035361]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
zeek_
Member

Откуда:
Сообщений: 10
Гавриленко Сергей Алексеевич
Это вы у нас спрашиваете?

Ну а у кого мне спрашивать?
8 дек 09, 14:57    [8035411]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
zeek_
После удаления индексов документа и констант CHECKDB ошибок не показал, но при монопольном входе и восстановлении индексов выдает Native ошибку и CREATE UNIQUE INDEX terminated because a duplicate key was found for index ID 1. Most significant primary key is '1010271'. Что это за ключ такой?


это значит что у вас в таблице две записи с одинаковым id = 1010271

находите одну из записей и удаляете или меняете, после этого индекс создасться если конечно небудет других таких записей:)
8 дек 09, 15:00    [8035448]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36799
zeek_
Гавриленко Сергей Алексеевич
Это вы у нас спрашиваете?

Ну а у кого мне спрашивать?
У вас таблица и данные. Откуда нам знать, что это за ключ такой?
8 дек 09, 15:01    [8035461]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
zeek_
Member

Откуда:
Сообщений: 10
Делаю выборку и индексов с таким id нет. Насколько я понимаю это не id, а primary key. А вот где хранятся эти ключи?
8 дек 09, 15:08    [8035535]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36799
zeek_
Делаю выборку и индексов с таким id нет. Насколько я понимаю это не id, а primary key. А вот где хранятся эти ключи?
Это не id индекса, а значение поля в таблице.

Сообщение было отредактировано: 8 дек 09, 15:09
8 дек 09, 15:09    [8035538]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
zeek_
Member

Откуда:
Сообщений: 10
Гавриленко Сергей Алексеевич
zeek_
Делаю выборку и индексов с таким id нет. Насколько я понимаю это не id, а primary key. А вот где хранятся эти ключи?
Это не id индекса, а значение поля в таблице.

Это я уже понял, интересно только какого.
8 дек 09, 15:19    [8035633]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31161
zeek_
Гавриленко Сергей Алексеевич
zeek_
Делаю выборку и индексов с таким id нет. Насколько я понимаю это не id, а primary key. А вот где хранятся эти ключи?
Это не id индекса, а значение поля в таблице.

Это я уже понял, интересно только какого.
Наверное, одного из тех, которые в этой CREATE UNIQUE INDEX
8 дек 09, 15:27    [8035735]     Ответить | Цитировать Сообщить модератору
 Re: Удаление всех индексов  [new]
zeek_
Member

Откуда:
Сообщений: 10
Что-то я совсем ничего не понимаю. Делаю DBCC CHECKDB ('<db_name>',REPAIR_REBUILD).
Он мне пишет :
DBCC results for 'DH603'.
Server: Msg 2511, Level 16, State 2, Line 1
Table error: Object ID 2009058193, Index ID 0. Keys out of order on page (1:15029), slots 98 and 99.
Server: Msg 2511, Level 16, State 1, Line 1
Table error: Object ID 2009058193, Index ID 3. Keys out of order on page (1:15077), slots 337 and 338.
Server: Msg 2511, Level 16, State 1, Line 1
Table error: Object ID 2009058193, Index ID 3. Keys out of order on page (1:16995), slots 337 and 338.

Потом делаю select [IDDOC], count(*) from DH603 group by [IDDOC] HAVING count(*) > 1 , он мне выдает пустую таблицу, потом пишу select [IDDOC], count(*) from DH603 и все индексы по одному, задвоиных нет. В чем тогда прикол?
9 дек 09, 12:48    [8040055]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить