YetAnotherForum
სალამი სტუმარს ძებნა | აქტიური თემები | შესვლა | რეგისტრაცია

ფავორიტებში დამატება
როგორ გავარკვიოთ ვინ ვის ბლოკავს
Vaja Offline
#1 Posted : Saturday, January 04, 2014 6:48:25 PM

Rank: Newbie

Medals:

Groups: Registered, Administrators
Joined: 11/5/2013
Posts: 2
Points: 9
Location: Georgia

Thanks: 0 times
Was thanked: 0 time(s) in 0 post(s)
/*
ბლოკირება არის ნორმალური პროცესი, რაც გამოწვეულია რელაციურ ბაზასთან მუშაობისას პარალელიზმის არსებობისას.
მაგრამ ხშირ შემთხვევებში იგი იწვევს შესამჩნევ დაყოვნებას და სერვერის წარმადობის გაუარესებას.
ქვემოთ მოცემული სკრიპტი დაგეხმარებათ სწრაფად გაარკვიოთ ის ძირითადი მიზეზები, რის გამოც გამოწვეულია ბლოკირება
*/


BB კოდი:
SELECT client_net_address as HOSTIP
        ,Blocking.session_id as BlockingSessionId
        , Sess.login_name AS BlockingUser
        , BlockingSQL.text AS BlockingSQL
        , Waits.wait_type WhyBlocked
        , Blocked.session_id AS BlockedSessionId
        , USER_NAME(Blocked.user_id) AS BlockedUser
        , BlockedSQL.text AS BlockedSQL
        , DB_NAME(Blocked.database_id) AS DatabaseName
FROM sys.dm_exec_connections AS Blocking INNER JOIN
    sys.dm_exec_requests AS Blocked ON Blocking.session_id = Blocked.blocking_session_id INNER JOIN
    sys.dm_os_waiting_tasks AS Waits  ON Blocked.session_id = Waits.session_id RIGHT OUTER JOIN
    sys.dm_exec_sessions Sess  ON Blocking.session_id = sess.session_id CROSS APPLY
    sys.dm_exec_sql_text(Blocking.most_recent_sql_handle) AS BlockingSQL CROSS APPLY
    sys.dm_exec_sql_text(Blocked.sql_handle) AS BlockedSQL
ORDER BY BlockingSessionId, BlockedSessionId
Sponsor  
 
Apex ltd. http://www.apex.ge
Vaja Offline
#2 Posted : Monday, January 06, 2014 8:07:49 PM

Rank: Newbie

Medals:

Groups: Registered, Administrators
Joined: 11/5/2013
Posts: 2
Points: 9
Location: Georgia

Thanks: 0 times
Was thanked: 0 time(s) in 0 post(s)
Activity monitor, Script to find Head blocker- SQL Server 2005, 2008 and later

BB კოდი:
SELECT
   [Session ID]    = s.session_id,
   [User Process]  = CONVERT(CHAR(1), s.is_user_process),
   [Login]         = s.login_name, 
   [Database]      = ISNULL(db_name(p.dbid), N''),
   [Task State]    = ISNULL(t.task_state, N''),
   [Command]       = ISNULL(r.command, N''),
   [Application]   = ISNULL(s.program_name, N''),
   [Wait Time (ms)]     = ISNULL(w.wait_duration_ms, 0),
   [Wait Type]     = ISNULL(w.wait_type, N''),
   [Wait Resource] = ISNULL(w.resource_description, N''),
   [Blocked By]    = ISNULL(CONVERT (varchar, w.blocking_session_id), ''),
   [Head Blocker]  =
        CASE
            -- session has an active request, is blocked, but is blocking others or session is idle but has an open tran and is blocking others
            WHEN r2.session_id IS NOT NULL AND (r.blocking_session_id = 0 OR r.session_id IS NULL) THEN '1'
            -- session is either not blocking someone, or is blocking someone but is blocked by another party
            ELSE ''
        END,
   [Total CPU (ms)] = s.cpu_time,
   [Total Physical I/O (MB)]   = (s.reads + s.writes) * 8 / 1024,
   [Memory Use (KB)]  = s.memory_usage * 8192 / 1024,
   [Open Transactions] = ISNULL(r.open_transaction_count,0),
   [Login Time]    = s.login_time,
   [Last Request Start Time] = s.last_request_start_time,
   [Host Name]     = ISNULL(s.host_name, N''),
   [Net Address]   = ISNULL(c.client_net_address, N''),
   [Execution Context ID] = ISNULL(t.exec_context_id, 0),
   [Request ID] = ISNULL(r.request_id, 0),
   [Workload Group] = ISNULL(g.name, N'')
FROM sys.dm_exec_sessions s LEFT OUTER JOIN sys.dm_exec_connections c ON (s.session_id = c.session_id)
LEFT OUTER JOIN sys.dm_exec_requests r ON (s.session_id = r.session_id)
LEFT OUTER JOIN sys.dm_os_tasks t ON (r.session_id = t.session_id AND r.request_id = t.request_id)
LEFT OUTER JOIN
(
    -- In some cases (e.g. parallel queries, also waiting for a worker), one thread can be flagged as
    -- waiting for several different threads.  This will cause that thread to show up in multiple rows
    -- in our grid, which we don't want.  Use ROW_NUMBER to select the longest wait for each thread,
    -- and use it as representative of the other wait relationships this thread is involved in.
    SELECT *, ROW_NUMBER() OVER (PARTITION BY waiting_task_address ORDER BY wait_duration_ms DESC) AS row_num
    FROM sys.dm_os_waiting_tasks
) w ON (t.task_address = w.waiting_task_address) AND w.row_num = 1
LEFT OUTER JOIN sys.dm_exec_requests r2 ON (s.session_id = r2.blocking_session_id)
LEFT OUTER JOIN sys.dm_resource_governor_workload_groups g ON (g.group_id = s.group_id)--TAKE THIS dmv OUT TO WORK IN 2005
LEFT OUTER JOIN sys.sysprocesses p ON (s.session_id = p.spid)
ORDER BY s.session_id;
Users browsing this topic
Guest
ფავორიტებში დამატება
Forum Jump  
თქვენ არ შეგიძლიათ დაწეროთ ახალი თემა ამ ფორუმში.
თქვენ არ შეგიძლიათ გასცეთ პასუხი, თემას, ამ ფორუმში .
თქვენ არ შეგიძლიათ წაშალოთ თქვენი პოსტი ამ ფორუმში.
თქვენ არ შეგიძლიათ ჩაასწოროთ თქვენი პოსტი ამ ფორუმში.
თქვენ არ შეგიძლიათ შექმნათ გამოკითხვა ამ ფორუმში.
თქვენ არ შეგიძლიათ ხმის მიცემა ამ ფოუმში.

YAFVision Theme by Jaben Cargman (Tiny Gecko)
Powered by YAF | YAF © 2003-2009, Yet Another Forum.NET
This page was generated in 0.082 seconds.