Как узнать текущий статус выполнения DELETE
Есть t1 в которой 10000000 записей с 2015 года Удаляем записи по условию где дата меньше 2018 года.
truncate в моем случае не вариант.
delete from t1 where date < '20180101'
Можно ли узнать на каком этапе удаления данных из таблицы, сколько еще ждать?
Ответы (1 шт):
К сожелению MSSQL не позволяет узнать сколько времени осталось на удаление. Но это всё же можно узнать пользуясь небольшими хитростями.
Надо узнать свой session_id в том коннекте где будет удаление. Сделать это можно например так
select @@spid;
или как-то так
insert into my_table (my_ses) values (@@spid);
Надо запомнить текущее к-во строк в таблице, например так
update my_table set c1 = (select count(*) from t1 with(nolock)) , c2 = (select count(*) from t1 with(nolock) where условие_удаления) where my_ses = @@spid
Только тогда можно узнать сколько строк удалилось и тому подобное.
- Запустить в сессии удаление
Теперь к-во строк в таблице можно узнать так
exec sp_spaceused 't1'
но это подходит только если вы в базе один работаете с таблицей.
Так же можно узнать статус вашей операции так
select * from sys.dm_exec_requests where session_id = ваша_сессия
вы узнаете завершилось удаление или ещё идёт. Поле row_count - будет поазывать сколько удалено. По с1 и с2 можно посчитать % выполнения. По остальным полям можно узнать другие детали. Поле total_elapsed_time показывает сколько времени выполняется запрос.
Так же можно воспользоваться Activity Monitor он встроен в оснастку, там есть и session_id и row count столбцы, и ваш запрос который выполняется будет виден.
В зависимости от вашей задачи, вы это можете делать а) из оснастки б) можно создать таск для удаления, таблицу, и хранимку или вью которое покажет нужную инфу. в) используя языки высокого уровня и делая данные запросы высчитать нужную информацию.