Üldiselt Microsoft on ka palju toredaid näiteid kokku pannud, aga enamasti ei leia neid õigel hetkel.
Üks disainiviga, mis võib ilmneda halbadel juhtudel on avatud transaktioon ehk rollbacki - commitit ei järgne. Kaks SQLi:
-- seda kasutaks mina, näitab kõiki avatud transaktsioone
SELECT convert(varchar(5000),s.context_info) as sessioonisonum, s.*
FROM sys.dm_exec_sessions AS s
WHERE EXISTS
(
SELECT *
FROM sys.dm_tran_session_transactions AS t
WHERE t.session_id = s.session_id
)
Microsofti näide oli, seal kuvatakse transaktioone, mis IDLE ehk üldse midagi ei toimu...
SELECT convert(varchar(5000),s.context_info) as sessioonisonum, s.*
FROM sys.dm_exec_sessions AS s
WHERE EXISTS
(
SELECT *
FROM sys.dm_tran_session_transactions AS t
WHERE t.session_id = s.session_id
)
AND NOT EXISTS
(
SELECT *
FROM sys.dm_exec_requests AS r
WHERE r.session_id = s.session_id
)
Nii, teeme nüüd näite, mis võite katsetada testserveril !
declare @vb varbinary(128)
set @vb=cast('adminn, ma näen sind' as varbinary)
set context_info @vb
begin tran
Ja, kui adminn esimest päringut sooritab, võite kindel olla, et Teile helistatakse ;))
Üldiselt, kui last_request_start_time näitab, et transaktsioon avatud rohkem, kui 15 min...oleks arukas see lõpetada.
kill on Sinu sõber
Lõpetuseks veel üks hea SQL Microsofti poolt, vägagi efektiivselt leiab päringud, mis serverit koormavad !!!
SELECT TOP 55 total_worker_time/execution_count AS [Avg CPU Time],
SUBSTRING(st.text, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY total_worker_time/execution_count DESC;
Kommentaare ei ole:
Postita kommentaar