Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak dowiedzieć się, co blokuje moje stoły?

Aby dostać się bezpośrednio do „kto jest blokowany/blokowany”, połączyłem/skróciłem sp_who i sp_lock w jedno zapytanie, które daje dobry przegląd tego, kto ma dany obiekt zablokowany na jakim poziomie.

--Create Procedure WhoLock
--AS
set nocount on
if object_id('tempdb..#locksummary') is not null Drop table #locksummary
if object_id('tempdb..#lock') is not null Drop table #lock
create table #lock (    spid int,    dbid int,    objId int,    indId int,    Type char(4),    resource nchar(32),    Mode char(8),    status char(6))
Insert into #lock exec sp_lock
if object_id('tempdb..#who') is not null Drop table #who
create table #who (     spid int, ecid int, status char(30),
            loginame char(128), hostname char(128),
            blk char(5), dbname char(128), cmd char(16)
            --
            , request_id INT --Needed for SQL 2008 onwards
            --
         )
Insert into #who exec sp_who
Print '-----------------------------------------'
Print 'Lock Summary for ' + @@servername  + ' (excluding tempdb):'
Print '-----------------------------------------' + Char(10)
Select     left(loginame, 28) as loginame, 
    left(db_name(dbid),128) as DB,
    left(object_name(objID),30) as object,
    max(mode) as [ToLevel],
    Count(*) as [How Many],
    Max(Case When mode= 'X' Then cmd Else null End) as [Xclusive lock for command],
    l.spid, hostname
into #LockSummary
from #lock l join #who w on l.spid= w.spid
where dbID != db_id('tempdb') and l.status='GRANT'
group by dbID, objID, l.spid, hostname, loginame

Select * from #LockSummary order by [ToLevel] Desc, [How Many] Desc, loginame, DB, object

Print '--------'
Print 'Who is blocking:'
Print '--------' + char(10)
SELECT p.spid
,convert(char(12), d.name) db_name
, program_name
, p.loginame
, convert(char(12), hostname) hostname
, cmd
, p.status
, p.blocked
, login_time
, last_batch
, p.spid
FROM      master..sysprocesses p
JOIN      master..sysdatabases d ON p.dbid =  d.dbid
WHERE     EXISTS (  SELECT 1
          FROM      master..sysprocesses p2
          WHERE     p2.blocked = p.spid )

Print '--------'
Print 'Details:'
Print '--------' + char(10)
Select     left(loginame, 30) as loginame,  l.spid,
    left(db_name(dbid),15) as DB,
    left(object_name(objID),40) as object,
    mode ,
    blk,
    l.status
from #lock l join #who w on l.spid= w.spid
where dbID != db_id('tempdb') and blk <>0
Order by mode desc, blk, loginame, dbID, objID, l.status

(Co oznaczają skróty poziomu blokady, zobacz np. https://technet.microsoft.com/en-us/library/ms175519%28v=sql.105%29.aspx)

Skopiowano z:sp_WhoLock – przechowywany proces T-SQL łączący sp_who i sp_lock...

NB kolumna [Xclusive lock for command] może wprowadzać w błąd – pokazuje bieżące polecenie dla tego spid; ale blokada X mogła zostać uruchomiona przez wcześniejsze polecenie w transakcji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Znajdź wszystkie tabele zawierające kolumnę o określonej nazwie - MS SQL Server

  2. Jak zwrócić przyrostowy numer grupy na grupę w SQL?

  3. Nazwane wystąpienie programu SQL Server z projektem Instalatora programu Visual Studio 2017

  4. Przykłady konwersji „data” na „smalldatetime” w SQL Server (T-SQL)

  5. Przekazywanie wartości varchar pełnej wartości oddzielonych przecinkami do funkcji SQL Server IN