SQL Сервер запускает взаимоблокировку - SQL Обновления - PullRequest
0 голосов
/ 07 января 2020

Я выбрал проект для устранения неполадок некоторых SQL Триггеров, которые блокируются. Пример кода здесь является одним из триггеров, которые обновляют поля. Мне интересно, если из-за количества обновлений этот триггер сталкивается с проблемами блокировки?

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[PAACS_CaseLog_UpdateForeignKeys]
    ON  [dbo].[PAACS_CaseLog]
    AFTER INSERT, UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF ((SELECT TRIGGER_NESTLEVEL(0, 'AFTER', 'DML')) < 2)
    BEGIN

        UPDATE upTarget
        SET upTarget.UK_casetimingid = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_CaseTiming forTarget ON forTarget.id = upTarget.casetiming_id
            LEFT JOIN PAACS_CaseTiming currentTarget ON currentTarget.UniqueId = upTarget.UK_CaseTimingId
        WHERE upTarget.UK_casetimingid IS NULL OR forTarget.id <> currentTarget.id

        UPDATE upTarget
        SET upTarget.UK_Operating_Surgeon_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget 
            LEFT JOIN PAACS_ShortTermFaculty forTarget ON forTarget.id = upTarget.Operating_Surgeon_id
            LEFT JOIN PAACS_ShortTermFaculty currentTarget ON currentTarget.UniqueId = upTarget.UK_Operating_Surgeon_Id
        WHERE upTarget.UK_Operating_Surgeon_id IS NULL AND upTarget.Operating_Surgeon_id IS NOT NULL OR forTarget.id <> currentTarget.id

        UPDATE upTarget
        SET upTarget.UK_Surgeon_on_Chart = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_ShortTermFaculty forTarget ON forTarget.id = upTarget.Surgeon_on_Chart
            LEFT JOIN PAACS_ShortTermFaculty currentTarget ON currentTarget.UniqueId = upTarget.UK_Surgeon_on_Chart
        WHERE upTarget.UK_Surgeon_on_Chart IS NULL AND upTarget.Surgeon_on_Chart IS NOT NULL OR forTarget.id <> currentTarget.id

        UPDATE upTarget
        SET upTarget.UK_surgeonrole_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_PickListItem forTarget ON forTarget.PickListItemId = upTarget.surgeonrole_id
            LEFT JOIN PAACs_PickListItem currentTarget ON currentTarget.UniqueId = upTarget.UK_surgeonrole_id
        WHERE upTarget.UK_surgeonrole_id IS NULL AND upTarget.surgeonrole_id IS NOT NULL OR forTarget.PickListItemId <> currentTarget.PickListItemId

        UPDATE upTarget
        SET upTarget.UK_assistant_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_ShortTermFaculty forTarget ON forTarget.id = upTarget.assistant_id
            LEFT JOIN PAACS_ShortTermFaculty currentTarget ON currentTarget.UniqueId = upTarget.UK_assistant_id
        WHERE upTarget.UK_assistant_id IS NULL AND upTarget.assistant_id IS NOT NULL OR forTarget.id <> currentTarget.id

        UPDATE upTarget
        SET upTarget.UK_assistantrole_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_PickListItem forTarget ON forTarget.PickListItemId = upTarget.assistantrole_id
            LEFT JOIN PAACS_PickListItem currentTarget ON currentTarget.UniqueId = upTarget.UK_assistantrole_id
        WHERE upTarget.UK_assistantrole_id IS NULL AND upTarget.assistantrole_id IS NOT NULL OR forTarget.PickListItemId <> currentTarget.PickListItemId

        UPDATE upTarget
        SET upTarget.UK_assistant2_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_ShortTermFaculty forTarget ON forTarget.id = upTarget.assistant2_id
            LEFT JOIN PAACS_ShortTermFaculty currentTarget ON currentTarget.UniqueId = upTarget.UK_assistant2_id
        WHERE upTarget.UK_assistant2_id IS NULL AND upTarget.assistant2_id IS NOT NULL OR forTarget.id <> currentTarget.id

        UPDATE upTarget
        SET upTarget.UK_assistant2role_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_PickListItem forTarget ON forTarget.PickListItemId = upTarget.assistant2role_id
            LEFT JOIN PAACS_PickListItem currentTarget ON currentTarget.UniqueId = upTarget.UK_assistant2role_id
        WHERE upTarget.UK_assistant2role_id IS NULL AND upTarget.assistant2role_id IS NOT NULL OR forTarget.PickListItemId <> currentTarget.PickListItemId

        UPDATE upTarget
        SET upTarget.UK_surgeon_of_record_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_ShortTermFaculty forTarget ON forTarget.Id = upTarget.surgeon_of_record_id
            LEFT JOIN PAACS_ShortTermFaculty currentTarget ON currentTarget.UniqueId = upTarget.UK_surgeon_of_record_id
        WHERE upTarget.UK_surgeon_of_record_id IS NULL AND upTarget.surgeon_of_record_id IS NOT NULL OR forTarget.id <> currentTarget.id

        UPDATE upTarget
        SET upTarget.UK_anesthesia_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_PickListItem forTarget ON forTarget.PickListItemId = upTarget.anesthesia_id
            LEFT JOIN PAACS_PickListItem currentTarget ON currentTarget.UniqueId = upTarget.UK_anesthesia_id
        WHERE upTarget.UK_anesthesia_id IS NULL AND upTarget.anesthesia_id IS NOT NULL OR forTarget.PickListItemId <> currentTarget.PickListItemId

        UPDATE upTarget
        SET upTarget.UK_anesthetist_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_ShortTermFaculty forTarget ON forTarget.id = upTarget.anesthetist_id
            LEFT JOIN PAACS_ShortTermFaculty currentTarget ON currentTarget.UniqueId = upTarget.UK_anesthetist_id
        WHERE upTarget.UK_anesthetist_id IS NULL AND upTarget.anesthetist_id IS NOT NULL OR forTarget.id <> currentTarget.id

        UPDATE upTarget
        SET upTarget.UK_anesthetist_Assistant_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_ShortTermFaculty forTarget ON forTarget.id = upTarget.anesthetist_Assistant_id
            LEFT JOIN PAACS_ShortTermFaculty currentTarget ON currentTarget.UniqueId = upTarget.UK_anesthetist_assistant_id
        WHERE upTarget.UK_anesthetist_Assistant_id IS NULL AND upTarget.anesthetist_Assistant_id IS NOT NULL OR forTarget.id <> currentTarget.id

        UPDATE upTarget
        SET upTarget.UK_severity_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_Severity forTarget ON forTarget.id = upTarget.severity_id
            LEFT JOIN PAACS_Severity currentTarget ON currentTarget.UniqueId = upTarget.UK_severity_id
        WHERE upTarget.UK_severity_id IS NULL AND upTarget.severity_id IS NOT NULL OR forTarget.id <> currentTarget.id

        UPDATE upTarget
        SET upTarget.UK_casetype_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_CaseType forTarget ON forTarget.id = upTarget.casetype_id
            LEFT JOIN PAACS_CaseType currentTarget ON currentTarget.UniqueId = upTarget.UK_casetype_id
        WHERE upTarget.UK_casetype_id IS NULL OR forTarget.id <> currentTarget.id

        UPDATE upTarget
        SET upTarget.UK_classification_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_Classification forTarget ON forTarget.id = upTarget.classification_id
            LEFT JOIN PAACS_Classification currentTarget ON currentTarget.UniqueId = upTarget.UK_classification_id
        WHERE upTarget.UK_casetype_id IS NULL AND upTarget.casetype_id IS NOT NULL OR forTarget.id <> currentTarget.id

        UPDATE upTarget
        SET upTarget.UK_statusId = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_CaseLogStatus forTarget ON forTarget.id = upTarget.status_id
            LEFT JOIN PAACS_CaseLogStatus currentTarget ON currentTarget.UniqueId = upTarget.UK_statusId
        WHERE upTarget.UK_statusId IS NULL OR forTarget.id <> currentTarget.id

        UPDATE upTarget
        SET upTarget.UK_ASA_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_Asa forTarget ON forTarget.ItemId = upTarget.ASA_id
            LEFT JOIN PAACS_Asa currentTarget ON currentTarget.UniqueId = upTarget.UK_ASA_id
        WHERE upTarget.UK_ASA_id IS NULL AND upTarget.ASA_id IS NOT NULL OR forTarget.ItemId <> currentTarget.ItemId

        UPDATE upTarget
        SET upTarget.UK_Resident_id = forTarget.UniqueID
        FROM PAACS_CaseLog upTarget
            LEFT JOIN PAACS_ShortTermFaculty forTarget ON forTarget.Id = upTarget.Resident_id
            LEFT JOIN PAACS_ShortTermFaculty currentTarget ON currentTarget.UniqueId = upTarget.UK_Resident_id
        WHERE upTarget.UK_Resident_id IS NULL AND upTarget.Resident_id IS NOT NULL OR forTarget.id <> currentTarget.id
    END;

Я выполнил план выполнения для этого триггера, и каждое обновление по сравнению с пакетной стоимостью между 2% и 13%.

Райан

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