Страница 1 из 1

Удаление завершенных шаблонов

Добавлено: 23 мар 2011, 15:26
Andrey000
Доброго времени суток.
Есть такая проблема, которая не дает покоя, а именно: За несколько лет работы, в лоции скопилась куча завершенных шаблонов работ (В меню - "Карты работ", это прямо под пунктом "Шаблоны" - версия 4.20). При попытке удалить хотя бы один из отработавших шаблонов вся база зависает на продолжительное время (все открытые лоции видимо просто блокируются). К слову зависание происходит даже при формировании списка этих шаблонов. Ну вот и собственно - как же реально удалить все эти ненужные завершенные шаблоны из лоции?

Re: Удаление завершенных шаблонов

Добавлено: 23 мар 2011, 23:02
Старик Крупский
Старовата версия... Оптимизация удаления карт работ была проведена, насколько я помню, в версии 4.30. Я бы всех от базы оторвал и во внерабочее время, на ночь, например, запустил бы удаление нескольких карт работ. Если все пройдет безошибочно, то можно в пятницу вечером запустить глобальное удаление. За выходные сделает, наверное. И на время удаления можно сервер автоматических этапов выключить, чтобы он сервер не грузил.
Я в 4.20 и 4.30 удалял карты ежемесячно.
В 4.40 такой проблемы и вовсе нет - там настраивается автоудаление. И вообще, 4.20 и 4.40 - это две приличные разницы :)

Re: Удаление завершенных шаблонов

Добавлено: 25 мар 2011, 15:36
Anderyt
оптимизация удаления появилась вроде в 4.40, незадолго до появления автоудаления..
мы раньше удаляли карты ежедневно.
ну по сути да, выход как раз такой - понемногу удалять, желательно в нерабочее время :-)
опять же, карты бывают разные. у нас при удалении карты из 31 тыс. этапов (несколько этапов повторялись в цикле) вообще клиент переставал реагировать, хотя блокировок на уровне БД не было, так что если такие карты есть - лучше их вообще обрабатывать отдельно либо не трогать вообще (в 4.40 с этим уже все в порядке).
при удалении может оказаться нелишним смотреть на загрузку сервера БД и блокировки. мы для этого используем такой запрос:

Код: Выделить всё

select spid, cpu, open_tran, last_batch, convert(nvarchar(20),hostname) as 'hostname',  convert(nvarchar(20), program_name) as 'program_name', convert(nvarchar(20), loginame) as 'loginame'
from
master..sysprocesses
where (status = 'runnable'
or open_tran >0)
order by cpu desc

select spid, blocked, open_tran, status, convert(nvarchar(20),hostname) as 'hostname', convert(nvarchar(20), loginame) as 'loginame' from master..sysprocesses
where blocked <>0

select spid, blocked, open_tran, status, convert(nvarchar(20),hostname) as 'hostname', convert(nvarchar(20), loginame) as 'loginame' from master..sysprocesses
where 
spid in 
(
select blocked from master..sysprocesses
where blocked <> 0
)
and blocked = 0
первая часть возвращает активные коннекты, которые runnable
в ней по идее должен светиться текущий коннект, который удаляет карты
вторая часть - те, кто оказался заблокированным
треться -коннект, который блокирует. в нем тоже может появиться текущий коннект
по spid можно убивать коннект через kill <spid> (клиент при этом безвозвратно отвалится от базы, так что аккуратнее :-) )
запрос, к слову, оказывается полезным и в повседневной работе, когда надо выяснить, почему висим и из-за кого