Тупик при использовании запроса задания для обновления статуса - PullRequest
0 голосов
/ 16 апреля 2020

У нас есть старое задание, выполненное по запросу для проверки электронной почты доставки и обновления статуса.

Сценарий:

While (
  Select cout(*)
  From tbl_EmailsDistributionlist
  where status = 'pending'
) > 2
OR
(
   Select count(*)
   From tbl_EmailsDistributionlist
   where status = 'Error'
) > 0
Begin
 update tbl_EmailsDistributionlist
 Set status = 'Error'
 where Status = 'Pending';

 while exists (
 Select *
 From tbl_EmailsDistributionlist
 where status = 'Error'
)
Begin;

with cte
as(
select top 1 emailsmsdisblid
from tbl_EmailsDistributionlist
where status ='Error'
order by emailsmsdisblid desc)

Update tbl_EmailsDistributionlist
Set status = 'Pending'
From tbl_EmailsDistributionlist e
   inner join CTE ON CTE.emailsmsdisbid = e.emailsmsdisbid
Waitfor delay '00:00:05';

end

Это задание выполняется каждый час.

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

Мой блок, как показано ниже:

enter image description here

и запросите это:

/*
    What is the performance bottleneck?
    Is there any blocking? If yes, who is the blocker?
    What are the queries which are executing currently?
    What is the name of the stored procedure running currently?
    Which statement in stored procedure is getting executed right now?
    Who is consuming CPU right now? What are the high CPU queries?
    Who is doing lots of IO right now?
*/


SELECT s.session_id
    ,r.STATUS
    ,r.blocking_session_id 'blocked by'
    ,r.wait_type
    ,wait_resource
    ,r.wait_time / (1000.0) 'Wait Time (in Sec)'
    ,r.cpu_time
    ,r.logical_reads
    ,r.reads
    ,r.writes
    ,r.total_elapsed_time / (1000.0) 'Elapsed Time (in Sec)'
    ,Substring(st.TEXT, (r.statement_start_offset / 2) + 1, (
            (
                CASE r.statement_end_offset
                    WHEN - 1
                        THEN Datalength(st.TEXT)
                    ELSE r.statement_end_offset
                    END - r.statement_start_offset
                ) / 2
            ) + 1) AS statement_text
    ,Coalesce(Quotename(Db_name(st.dbid)) + N'.' + Quotename(Object_schema_name(st.objectid, st.dbid)) + N'.' + 
     Quotename(Object_name(st.objectid, st.dbid)), '') AS command_text
    ,r.command
    ,s.login_name
    ,s.host_name
    ,s.program_name
    ,s.host_process_id
    ,s.last_request_end_time
    ,s.login_time
    ,r.open_transaction_count
FROM sys.dm_exec_sessions AS s
INNER JOIN sys.dm_exec_requests AS r ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
WHERE r.session_id != @@SPID
ORDER BY r.cpu_time DESC
    ,r.STATUS
    ,r.blocking_session_id
    ,s.session_id

Я мертв для решения вручную.

Спасибо за ваш совет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...