Как узнать текущий статус выполнения DELETE

Есть t1 в которой 10000000 записей с 2015 года Удаляем записи по условию где дата меньше 2018 года.

truncate в моем случае не вариант.

delete from t1 where date < '20180101'

Можно ли узнать на каком этапе удаления данных из таблицы, сколько еще ждать?


Ответы (1 шт):

Автор решения: nick_n_a

К сожелению MSSQL не позволяет узнать сколько времени осталось на удаление. Но это всё же можно узнать пользуясь небольшими хитростями.

  1. Надо узнать свой session_id в том коннекте где будет удаление. Сделать это можно например так

    select @@spid;
    

или как-то так

insert into my_table (my_ses) values (@@spid);
  1. Надо запомнить текущее к-во строк в таблице, например так

    update my_table set 
     c1 = (select count(*) from t1 with(nolock)) ,
     c2 = (select count(*) from t1 with(nolock) where условие_удаления)
    where my_ses = @@spid
    

Только тогда можно узнать сколько строк удалилось и тому подобное.

  1. Запустить в сессии удаление

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

  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 столбцы, и ваш запрос который выполняется будет виден.

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

→ Ссылка