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

Откуда: Украина. Киев
Сообщений: 231
Приветствую.
Проблема не очень критична, но неприятна :)
Есть программа, к-я вызывает хп с большим инсертом. Для ускорения, перед инсертом индексы удаляю, после - восстанавливаю.
Если инсерт слетает (или прогу снимают тремя пальцами), при старте ее снова предусмотрено проверка и восстановление индекса.
Проблема возникает если два юзера запускают прогу - она инициирует два create index, т.к. в sysindex запись появляется после создания индекса.
Есть ли возможномсть определить, что индекс начинает строиться?
Спасибо
13 июл 11, 18:52    [10969764]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Нельзя создать два индекса с одинаковым именем.
13 июл 11, 18:53    [10969775]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Кроме того, одновременно создавать индексы на одной и той же таблице не выйдет из-за блокировок
13 июл 11, 18:56    [10969791]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
man2002ua
Member

Откуда: Украина. Киев
Сообщений: 231
Мне и не нужно это. Мне нужно, чтобы работало так -
if not exists (select * from sysindex where name='my_index')
create index my_index

Дело в том, что если My_index строится около минуты - sysindex Все это время его не видит.
И запуск
if not exists (select * from sysindex where name='my_index')
create index my_index
в другой сессии - вызывает ошибку.

Надеюсь теперь понятно, что мне нуно :)
13 июл 11, 18:56    [10969792]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
man2002ua
Мне и не нужно это. Мне нужно, чтобы работало так -
if not exists (select * from sysindex where name='my_index')
create index my_index

Дело в том, что если My_index строится около минуты - sysindex Все это время его не видит.
И запуск
if not exists (select * from sysindex where name='my_index')
create index my_index
в другой сессии - вызывает ошибку.

Надеюсь теперь понятно, что мне нуно :)
Какую еще ошибку?
13 июл 11, 18:57    [10969797]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
man2002ua
Member

Откуда: Украина. Киев
Сообщений: 231
хмм. Index exists!
13 июл 11, 18:58    [10969802]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
man2002ua
хмм. Index exists!
А вы ошибки обрабатывать не умеете что ли?
13 июл 11, 18:58    [10969803]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
man2002ua
Member

Откуда: Украина. Киев
Сообщений: 231
1. MSSQL2000 or 2005 (no TRY/CATCH)
2. программа не моя, надо все обернуть в проверку с помошью TSQL
13 июл 11, 18:59    [10969811]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Ну, сделайте создание индекса асинхронно (джобом).
Или костыль через sp_getapplock вбейте.
13 июл 11, 19:01    [10969817]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
man2002ua
Member

Откуда: Украина. Киев
Сообщений: 231
Ok, на счет job хорошая идея. Спасибо
13 июл 11, 19:08    [10969847]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
man2002ua
Есть программа, к-я вызывает хп с большим инсертом. Для ускорения, перед инсертом индексы удаляю, после - восстанавливаю.


Может лезу не в свое дело, а не проще индексы не удалять, а отключать?
Как-то так:

USE [MyBase]
GO
ALTER INDEX [ix_test] ON [dbo].[a1] DISABLE
GO


А потом, включать соответственно...
?
13 июл 11, 22:25    [10970361]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
sp_getapplock
Ставим пользовательскую блокировку перед созданием индекса.
13 июл 11, 22:45    [10970442]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
А может просто завести табличку с флагом/признаком ?
14 июл 11, 11:20    [10971993]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
Гадя Петрович
Member

Откуда: планета Плюк, 215 в тентуре, галактика Кин-дза-дза в Спирали
Сообщений: 52912
Andrey Sribnyak
Может лезу не в свое дело, а не проще индексы не удалять, а отключать?
а с кластерными как быть?
14 июл 11, 11:33    [10972096]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
Гадя Петрович
Andrey Sribnyak
Может лезу не в свое дело, а не проще индексы не удалять, а отключать?
а с кластерными как быть?


А кластерный не нужно и трогать.. иначе потом с фрагментацией повеситься можно будет
14 июл 11, 11:49    [10972277]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
Гадя Петрович
Member

Откуда: планета Плюк, 215 в тентуре, галактика Кин-дза-дза в Спирали
Сообщений: 52912
Andrey Sribnyak
Гадя Петрович
пропущено...
а с кластерными как быть?
А кластерный не нужно и трогать.. иначе потом с фрагментацией повеситься можно будет
откуда фрагментация, если индекс включается ребилдом?
а если отключить кластерный - то инсерты и вовсе невозможны
14 июл 11, 12:08    [10972464]     Ответить | Цитировать Сообщить модератору
 Re: Пересоздание индексов  [new]
man2002ua
Member

Откуда: Украина. Киев
Сообщений: 231
Andrey Sribnyak
man2002ua
Есть программа, к-я вызывает хп с большим инсертом. Для ускорения, перед инсертом индексы удаляю, после - восстанавливаю.


Может лезу не в свое дело, а не проще индексы не удалять, а отключать?
Как-то так:

USE [MyBase]
GO
ALTER INDEX [ix_test] ON [dbo].[a1] DISABLE
GO


А потом, включать соответственно...
?


Условие - поддержка MSSQL 2000 и выше
14 июл 11, 12:36    [10972768]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить