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

Откуда:
Сообщений: 24
Доброго дня!

Есть вопрос по переиндексации БД.

Ранее использовал стандартный пункт Mantainance Plain - Rebild Indexes (или типа того)

Иногда возникала проблема - некто длительно блокирует какую либо таблицу/запись, поэтому переиндексация встает на неопределенное время.

Сейчас планирую делать переиндексацию с помощью скрипта (см. ниже), перебирая имена таблиц БД и выполняя переиндексацию отдельно для каждой.

Хочется узнать, каким образом проверить - есть ли блокировки на таблице, которую собираюсь переиндексировать?
6 авг 09, 12:23    [7505038]     Ответить | Цитировать Сообщить модератору
 Переиндексация  [new]
Velifer
Member

Откуда:
Сообщений: 24
-- выгоняем всех из базы
alter database v8a5SPbTest2 set RESTRICTED_USER with rollback immediate
alter database v8a5SPbTest2 set MULTI_USER

USE v8a5SPbTest2

-- перебираем все имена таблиц текущей БД
--DECLARE @ErrorLog Table(Name Char(30))

DECLARE @tablename sysname
DECLARE reindex_cursor CURSOR FOR SELECT Name FROM sysobjects WHERE xtype = 'U' ORDER BY name

OPEN reindex_cursor
FETCH NEXT FROM reindex_cursor INTO @tablename

WHILE (@@FETCH_STATUS <> -1)

BEGIN TRY
-- переиндексация в попытке
DBCC DBREINDEX (@tablename)
END TRY
BEGIN CATCH
END CATCH
FETCH NEXT FROM reindex_cursor INTO @tablename

CLOSE reindex_cursor
DEALLOCATE reindex_cursor
6 авг 09, 12:26    [7505058]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36807
Ну так найдите этого некто и разберитесь, чего это он так долго записи блокирует.
6 авг 09, 12:28    [7505072]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Velifer
Member

Откуда:
Сообщений: 24
Сразу вопрос:

1) Отработает ли конструкция


BEGIN TRY
-- переиндексация в попытке
DBCC DBREINDEX (@tablename)
END TRY
BEGIN CATCH
END CATCH


в том случае, если таблица @tablename заблокирована?

Если да, то поможет ли SET LOCK_TIMEOUT 0 пропускать заблокированные таблицы сразу?
6 авг 09, 12:29    [7505074]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36807
-- выгоняем всех из базы
alter database v8a5SPbTest2 set RESTRICTED_USER with rollback immediate
alter database v8a5SPbTest2 set MULTI_USER

-- и тут все разом ломанулись назад
...
6 авг 09, 12:29    [7505075]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Velifer
Member

Откуда:
Сообщений: 24
Переиндексация работает ночью.

И она должна отработать за ночь, гарантированно.

Руководство совершенно не волнует, что там ночью произошло, из за чего база на утро висит :)
6 авг 09, 12:31    [7505084]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36807
Velifer
Переиндексация работает ночью.

И она должна отработать за ночь, гарантированно.

Руководство совершенно не волнует, что там ночью произошло, из за чего база на утро висит :)
Вам уже написали команду отключения пользователей от базы.

Сообщение было отредактировано: 6 авг 09, 12:34
6 авг 09, 12:34    [7505109]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Velifer
Member

Откуда:
Сообщений: 24
Интересуют все же ответы на мои вопросы.

Нужно либо заблокировать БД от пользователей, либо пропустить заблокированные таблицы при переиндексации.

Заблокировать БД пробовал, переведя базу в single_user

exec sp_dboption ИмяБазы, 'single_user', true

Наткнулся на проблему - если кто то из 1С пытается зайти в заблокированную базу, то его конечно не пускают, но после этого не удается выполнить обратную команду:

exec sp_dboption ИмяБазы, 'single_user', false

Помог перезапуск процесса

Так что такой вариант не катит
6 авг 09, 13:06    [7505355]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Velifer
Member

Откуда:
Сообщений: 24
Гавриленко Сергей Алексеевич,

Поскольку переиндексация идет ночью, то вероятность входа пользователя в БД мала

Так что можно просто пропускать заблокированные таблицы

Как это сделать?
6 авг 09, 13:08    [7505370]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Velifer
Member

Откуда:
Сообщений: 24
Можно ли просто использовать конструкцию TRY-CATCH ?
6 авг 09, 13:09    [7505376]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Glory
Member

Откуда:
Сообщений: 104760
И что мешает перед DBCC DBREINDEX сделать select к таблице с эксклюзивной блокировкой в тексте запроса ?
6 авг 09, 13:10    [7505379]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Velifer
Member

Откуда:
Сообщений: 24
Таблицы то здоровые, вся база полтерабайта

Предлагаете делать в транзакции SELECT * FROM @tablename WITH (TABLOCK) ?

Хотите сказать - это простое решение?

Кроме того, если мне не удалось заблокирвоать таблицу - как поведет себя скрипт?
6 авг 09, 13:17    [7505442]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Glory
Member

Откуда:
Сообщений: 104760
Velifer
Таблицы то здоровые, вся база полтерабайта

Предлагаете делать в транзакции SELECT * FROM @tablename WITH (TABLOCK) ?

Хотите сказать - это простое решение?

Кроме того, если мне не удалось заблокирвоать таблицу - как поведет себя скрипт?


А SELECT * FROM @tablename WITH (TABLOCK) WHERE 1=0 не спасет отца русской переиндексации ?
6 авг 09, 13:25    [7505512]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33354
Блог
Как бы это сказать... фиговый у вас скрипт. Зачем переиндексировать индесы, у которых степень фрагментации ну скажем 5%, а если индекс на очень большой таблице построен, то вообще труба будет.
6 авг 09, 13:28    [7505539]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Velifer
Member

Откуда:
Сообщений: 24
Критик,

Ну работает, часа полтора на всю базу, в чем проблема то?
6 авг 09, 13:38    [7505613]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Velifer
Member

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

Может быть :)

Но все таки, как поведет себя скрипт, если мне не удалось заблокировать таблицу?

Вывалится? Зависнет?

Мне нужно пропустить таблицу и продолжить выполнение скрипта
6 авг 09, 13:50    [7505723]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Glory
Member

Откуда:
Сообщений: 104760
Velifer
Glory,

Может быть :)

Но все таки, как поведет себя скрипт, если мне не удалось заблокировать таблицу?

Вывалится? Зависнет?

Мне нужно пропустить таблицу и продолжить выполнение скрипта

Ну вы же вроде сказали, что знакомы с SET LOCK_TIMEOUT и перехватом ошибок ? Или мне показалось ?
6 авг 09, 13:52    [7505743]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Velifer
Member

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

Ну, я не слишком плотно работаю с T-SQL :)

Я просто не уверен, как отработает та или иная конструкция

Так вы утверждаете, что достаточно сделать

SET LOCK_TIMEOUT 0

WHILE (@@FETCH_STATUS <> -1)

BEGIN TRY
BEGIN TRANSACTION
SELECT * FROM @tablename WITH (TABLOCK) WHERE 1=0
ROLLBACK TRANSACTION

DBCC DBREINDEX (@tablename)
END TRY
BEGIN CATCH
END CATCH
6 авг 09, 14:43    [7506222]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ну чего проще сделать два коннекта и попробовать самому ?
И явная транзакция для одного запроса не нужна. И хинт нужен TABLOCKX, а не TABLOCK
6 авг 09, 14:58    [7506320]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Velifer
Member

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

А почему не работает

SELECT * FROM @tablename WITH (TABLOCK) WHERE 1=0

Говорит, что

Must declare the table variable "@tablename"

Как правильно писать?
6 авг 09, 15:42    [7506665]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Glory
Member

Откуда:
Сообщений: 104760
Здрасте, приплыли. Писать надо имя таблицы.
6 авг 09, 15:45    [7506681]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Velifer
Member

Откуда:
Сообщений: 24
я ж грю, я с t-sql не работаю плотно :)

так как надо писать?
6 авг 09, 15:49    [7506708]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
Velifer
я ж грю, я с t-sql не работаю плотно :)

так как надо писать?

а что у Вас в @tablename хранится на момент выполнения?
6 авг 09, 15:51    [7506715]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Velifer
Member

Откуда:
Сообщений: 24
Алексей2003,

DECLARE @tablename sysname
DECLARE reindex_cursor CURSOR FOR SELECT Name FROM sysobjects WHERE xtype = 'U' ORDER BY name

OPEN reindex_cursor
FETCH NEXT FROM reindex_cursor INTO @tablename
6 авг 09, 15:55    [7506735]     Ответить | Цитировать Сообщить модератору
 Re: Переиндексация  [new]
Velifer
Member

Откуда:
Сообщений: 24
Алексей2003,

Допустим, там будет varchar, все равно не работает

Грит, что @tablename должна быть переменной типа table
6 авг 09, 15:57    [7506753]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить