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

Откуда:
Сообщений: 132
Всем доброго времени суток!

Есть библиотека, которая проверяет наличие индекса и если он отсутствует, то запускает его создание.
На большом объеме данных индексы строятся продолжительное время.
Если в этот момент запустить библиотеку еще раз, то она не обнаружив индекса запускает его создание опять.

Как определить что в данный момент индекс строится?

Спасибо.
5 июл 17, 14:33    [20615938]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
Владислав Колосов
Member

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

придумайте маркер, например, глобальную временную таблицу.
5 июл 17, 14:42    [20615983]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
blonduser
Member

Откуда:
Сообщений: 132
Владислав Колосов,

С маркером все понятно, а вот средствами SQL сервера это никак нельзя сделать?
5 июл 17, 15:26    [20616187]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
blonduser
Владислав Колосов,
С маркером все понятно, а вот средствами SQL сервера это никак нельзя сделать?

GOOGLE
а дальше пишем всякие условия.
5 июл 17, 15:54    [20616286]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
blonduser
Как определить что в данный момент индекс строится?
Бесполезная проверка. Ее результат теряет смысл сразу после получения.

Индекс из вашей библиотеке нужно создавать примерно так:
declare @result int;

set xact_abort on;
begin tran;

exec @result = sp_getapplock N'Таблица.Индекс', N'Exclusive', N'Transaction';
if @result < 0
 begin
  raiserror('sp_getapplock error %d', 16, 1, @result);

  if @@trancount > 0
   rollback;

  return;
 end;

if indexproperty(object_id(N'Таблица'), N'Индекс', N'IndexId') is null
 create index ...

commit;

Ну или примените любой другой способ, сериализующий набор действий с этим индексом.
5 июл 17, 16:05    [20616335]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
blonduser
Member

Откуда:
Сообщений: 132
invm
blonduser
Как определить что в данный момент индекс строится?
Бесполезная проверка. Ее результат теряет смысл сразу после получения.


Мне нужен результат именно на момент проверки.
То что потом будет происходить с индексом мне не интересно.
5 июл 17, 16:23    [20616418]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
Владислав Колосов
Member

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

ну так это то вариант маркера.

blonduser
почему Вы решили, что временная таблица или апплок - это не средства SQL сервера? А средства чего это? Или вы хотите серверу приделать костыль против кривой реализации библиотеки?
5 июл 17, 16:45    [20616522]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
blonduser
Member

Откуда:
Сообщений: 132
Владислав Колосов,

Я пока думаю как лучше сделать и собираю информацию.
6 июл 17, 10:51    [20618080]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
blonduser,

если билблиотека ваша - запретите второй запуск
6 июл 17, 10:56    [20618104]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
blonduser
Member

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

Библиотека моя, но запускаться она может одновременно с разных станций.
6 июл 17, 11:10    [20618164]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
blonduser,

sp_getapplock наверное более правильный вариант
6 июл 17, 11:16    [20618189]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
blonduser
Мне нужен результат именно на момент проверки.
То что потом будет происходить с индексом мне не интересно.
Так вам просто интересно выполняется создание индекса или нет? Намерения устранить ошибку нету?
6 июл 17, 11:18    [20618201]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
0wl
Member

Откуда:
Сообщений: 53
Плюсую за sp_getapplock. Если блокирующая сессия по какой-то причине отвалится, блокировка исчезнет вместе с ней. Если же делать какую-то более "материальную" реализацию семафора (напр., глобальную временную таблицу), придется думать о подчищении хвостов в случае каких-то сбоев, таймаутов и т.п.
6 июл 17, 11:28    [20618252]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
blonduser
Member

Откуда:
Сообщений: 132
invm
blonduser
Мне нужен результат именно на момент проверки.
То что потом будет происходить с индексом мне не интересно.
Так вам просто интересно выполняется создание индекса или нет? Намерения устранить ошибку нету?


Именно.
Если индекс строится, то выдать сообщение что индекс в процессе создания и не повторно не давать запускать его создание.
6 июл 17, 11:31    [20618268]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
blonduser
Если индекс строится, то выдать сообщение что индекс в процессе создания
Слегка модифицируете мой пример:
declare @result int;

set xact_abort on;
begin tran;

exec @result = sp_getapplock N'Таблица.Индекс', N'Exclusive', N'Transaction', 0;

if @result < 0
 begin
  if @result = -1
   raiserror('Таблица.Индекс в процессе создания', 16, 1, @result);
  else
   raiserror('sp_getapplock error %d', 16, 1, @result);

  if @@trancount > 0
   rollback;

  return;
 end;

if indexproperty(object_id(N'Таблица'), N'Индекс', N'IndexId') is null
 create index ...

commit;
6 июл 17, 12:01    [20618458]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
blonduser
Member

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

Спасибо.
Сделал чуть проще.
Делаю лок на сессию и возвращаю результат.
Ошибку формирую уже из кода.
6 июл 17, 12:17    [20618538]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
blonduser
Сделал чуть проще.
Делаю лок на сессию и возвращаю результат.
Это не проще, а сложнее. Лок на сессию придется снимать вручную. Если по какой-либо причине не снимется - получите проблемы.
6 июл 17, 12:27    [20618570]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
blonduser
Member

Откуда:
Сообщений: 132
invm
blonduser
Сделал чуть проще.
Делаю лок на сессию и возвращаю результат.
Это не проще, а сложнее. Лок на сессию придется снимать вручную. Если по какой-либо причине не снимется - получите проблемы.

При разрыве коннекта лок сам снимается или нет?
6 июл 17, 12:47    [20618658]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
blonduser
При разрыве коннекта лок сам снимается или нет?
Снимется.
6 июл 17, 13:01    [20618751]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
0wl
Member

Откуда:
Сообщений: 53
blonduser
При разрыве коннекта лок сам снимается или нет?


Да, снимется:

Locks associated with the session are released when the session is logged out. When the server shuts down for any reason, all locks are released.

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-getapplock-transact-sql

Хотя я бы накладывал блокировку в рамках транзакции -- ее, по сравнению с сессионной блокировкой, сложнее забыть закрыть
6 июл 17, 13:04    [20618774]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, что индекс создается в данный момент?  [new]
Addx
Member

Откуда:
Сообщений: 957
Вообще, дурацкая идея с разных машин автоматически строить индексы.
6 июл 17, 15:40    [20619579]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить