2017-11-24 3 views
1

Ich führe eine gespeicherte Prozedur aus, die regelmäßig am Job Scheduler um 12.01 Uhr Serverzeit aktualisiert werden muss, ohne dass ein Deadlock oder irgendwelche Störungen auftreten.Gespeicherte Prozedur ohne Deadlock und Anwendung ausführen, ohne fest zu hängen

Die Prozedur wird vollständige Zeilen um 15000 Datensätze zur Berechnung auswerten und muss aktualisiert werden und es dauert 2 Minuten, um die Ausführung abzuschließen.

Also habe ich diesen Code unten hinzugefügt, um Deadlock während der Ausführung dieses Verfahrens zu vermeiden, bis es abgeschlossen ist.

SET DEADLOCK_PRIORITY HIGH 

exec [ProcedureName] 

SET DEADLOCK_PRIORITY LOW 

Ist dieser Code ein Problem in DB-Betrieb oder eine Anwendung Leistung führen wird?

Hinweis: Ich habe dies mit mehreren Personen getestet, um Zugriff auf die Anwendungsraster zu erhalten, während ich die Abfrage ausgeführt habe. Es hat keinerlei Auswirkungen auf die Leistung und meine Anforderung wurde ebenfalls gelöst. Möchte aber immer noch mehr über Abhängigkeiten von DB wissen. Bitte legen nahe,

Dank

Antwort

0

Wenn Sie Abfragehinweise für eine stored proc entscheiden, gibt es Gelegenheit für Riegelschlösser für alle parallelen Prozesse geschieht.

Sie bemerken möglicherweise keinen Leistungseinbruch, da andere Abfragen möglicherweise ausgesetzt werden. sp_who2 .Es ist eine gute Idee für alle blockierte Prozesse während der Ausführung des proc

SELECT * FROM dbo.sysprocesses WHERE spid IN 
    (SELECT blocked FROM dbo.sysprocesses where blocked <> 0) 

zu verfolgen Wenn Sie blockierte Prozesse nicht sehen, die für alle Riegelschlösser zum Zeitpunkt der Ausführung.

SELECT L.request_session_id AS SPID, 
    DB_NAME(L.resource_database_id) AS DatabaseName, 
    O.Name AS LockedObjectName, 
    P.object_id AS LockedObjectId, 
    L.resource_type AS LockedResource, 
    L.request_mode AS LockType, 
    ST.text AS SqlStatementText,   
    ES.login_name AS LoginName, 
    ES.host_name AS HostName, 
    TST.is_user_transaction as IsUserTransaction, 
    AT.name as TransactionName, 
    CN.auth_scheme as AuthenticationMethod 
FROM sys.dm_tran_locks L 
    JOIN sys.partitions P ON P.hobt_id = L.resource_associated_entity_id 
    JOIN sys.objects O ON O.object_id = P.object_id 
    JOIN sys.dm_exec_sessions ES ON ES.session_id = L.request_session_id 
    JOIN sys.dm_tran_session_transactions TST ON ES.session_id = TST.session_id 
    JOIN sys.dm_tran_active_transactions AT ON TST.transaction_id = AT.transaction_id 
    JOIN sys.dm_exec_connections CN ON CN.session_id = ES.session_id 
    CROSS APPLY sys.dm_exec_sql_text(CN.most_recent_sql_handle) AS ST 
WHERE resource_database_id = db_id() 

Es lohnt sich, Perfmon-Leistungsindikatoren und alle langsam laufenden Abfragen bei der Ausführung zu betrachten. Die Frage der Debatte ist, warum wir SET DEADLOCK_PRIORITY HIGH verwenden möchten, haben Sie Transaktionsisolation Ebenen auf der Datenbank festgelegt. Die Umstellung auf read committed snapshot isolation level würde die Notwendigkeit, diese Abfragehinweise zu verwenden, erheblich reduzieren. Bitte beziehen Sie sich auf https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server.

Diese Abfrage teilt Ihnen den Status der Isolationsstufe in Ihrer Datenbank mit.

+0

>>> nach irgendwelchen toten Sperren zum Zeitpunkt der Ausführung suchen: .... <<< Glauben Sie wirklich, dass jemand in der Lage ist, Deadlocks auf diese Weise zu überwachen? Wissen Sie, wie SQL Server Dedlocks auflöst? – sepupic

+0

Ich hatte die gleiche Frage im realen Szenario, ich habe E-Mail-Alarm eingerichtet und überwacht. Ofcos wir alle wissen, SQL heilt Deadlocks selbst und ich glaube, es ist wichtig, das Opfer von Dead Lock, Tisch getroffen und so weiter zu finden. –

+0

Jeder Deadlock wird vor der Ausführung von F5 gelöst werden, um Ihren Code auszuführen – sepupic

Verwandte Themen