なぜSPIDのステータスが中断されているのかを確認する方法SPIDが待っているリソース?

StackOverflow https://stackoverflow.com//questions/22038695

役に立ちましたか?

解決

中断: これは、リソースがリソースを待っているためアクティブではないことを意味します。リソースはページを読み取るためのI / Oになることができ、ウェイトがネットワーク上の通信をすることも、ロックまたはラッチを待っているかを待っています。それが待っているタスクが完了したらアクティブになります。たとえば、クエリが完全な表Tblestudentのデータを読み取るための入出力要求を投稿した場合、このタスクはI / Oが完了するまで中断されます。 I / Oが完了すると(表TbLSTUDENTSのデータがメモリ内で利用可能です)、クエリはRunnableキューに移動します。

だから待っている場合は、wait_timeに基づいて待機してトラブルシューティングを理解するためにwait_type列を確認してください。

私はこれを使って私を助ける次の手順を開発しました、それはwait_typeを含みます。

use master
go

CREATE PROCEDURE [dbo].[sp_radhe] 

AS
BEGIN

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT es.session_id AS session_id
,COALESCE(es.original_login_name, '') AS login_name
,COALESCE(es.host_name,'') AS hostname
,COALESCE(es.last_request_end_time,es.last_request_start_time) AS last_batch
,es.status
,COALESCE(er.blocking_session_id,0) AS blocked_by
,COALESCE(er.wait_type,'MISCELLANEOUS') AS waittype
,COALESCE(er.wait_time,0) AS waittime
,COALESCE(er.last_wait_type,'MISCELLANEOUS') AS lastwaittype
,COALESCE(er.wait_resource,'') AS waitresource
,coalesce(db_name(er.database_id),'No Info') as dbid
,COALESCE(er.command,'AWAITING COMMAND') AS cmd
,sql_text=st.text
,transaction_isolation =
    CASE es.transaction_isolation_level
    WHEN 0 THEN 'Unspecified'
    WHEN 1 THEN 'Read Uncommitted'
    WHEN 2 THEN 'Read Committed'
    WHEN 3 THEN 'Repeatable'
    WHEN 4 THEN 'Serializable'
    WHEN 5 THEN 'Snapshot'
END
,COALESCE(es.cpu_time,0) 
    + COALESCE(er.cpu_time,0) AS cpu
,COALESCE(es.reads,0) 
    + COALESCE(es.writes,0) 
    + COALESCE(er.reads,0) 
    + COALESCE(er.writes,0) AS physical_io
,COALESCE(er.open_transaction_count,-1) AS open_tran
,COALESCE(es.program_name,'') AS program_name
,es.login_time
FROM sys.dm_exec_sessions es
    LEFT OUTER JOIN sys.dm_exec_connections ec ON es.session_id = ec.session_id
    LEFT OUTER JOIN sys.dm_exec_requests er ON es.session_id = er.session_id
    LEFT OUTER JOIN sys.server_principals sp ON es.security_id = sp.sid
    LEFT OUTER JOIN sys.dm_os_tasks ota ON es.session_id = ota.session_id
    LEFT OUTER JOIN sys.dm_os_threads oth ON ota.worker_address = oth.worker_address
    CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS st
where es.is_user_process = 1 
  and es.session_id <> @@spid
ORDER BY es.session_id

end 
.

以下のクエリは、SPIDがどのリソースを待っているかを示すことで、SPIDが中断されたときに補助する基本情報を表示することもできます。

SELECT  wt.session_id, 
    ot.task_state, 
    wt.wait_type, 
    wt.wait_duration_ms, 
    wt.blocking_session_id, 
    wt.resource_description, 
    es.[host_name], 
    es.[program_name] 
FROM  sys.dm_os_waiting_tasks  wt  
INNER  JOIN sys.dm_os_tasks ot ON ot.task_address = wt.waiting_task_address 
INNER JOIN sys.dm_exec_sessions es ON es.session_id = wt.session_id 
WHERE es.is_user_process =  1 
.

例として下の図をご覧ください。

ENTER ENTER IMENTDESCRUショニング

他のヒント

SP_WHOISACTIVEを使用して、このような情報を調べて、遅いクエリのトラブルシューティングのための良い情報を提供する準備ができているフリーツールであるため、

SP_WHOISACTIONの使用方法低速SQL Serverクエリを見つける

これで、クエリテキスト、使用しているプラン、クエリが待機しているリソース、ブロックしているもの、どのようなロックを解除しているか、そして全体的にはるかに多い。

あなた自身のロールを転がそうことよりもはるかに簡単です。

あなたはそれを解決することができます:

  1. クラスタインデックスを修正してください。
  2. 時間表を使用して、すべてのテーブルの一部を取得してそれを取り扱ってください。
  3. 私は400,000,000行のテーブルと同じ問題を持ち、その一部を取得するために時間表を使用してから、インデックスを変更することはオプションではありません。

    いくつかの例:

    --
    --this is need be cause DECLARE @TEMPORAL are not well for a lot of data.
    CREATE TABLE #TEMPORAL
    (
        ID BIGINT,
        ID2 BIGINT,
        DATA1 DECIMAL,
        DATA2 DECIMAL
    );
    
    WITH TABLE1 AS
    (
        SELECT
            L.ID,
            L.ID2,
            L.DATA
        FROM LARGEDATA L
        WHERE L.ID = 1
    ), WITH TABLE2 AS
    (
        SELECT
            L.ID,
            L.ID2,
            L.DATA
        FROM LARGEDATA L
        WHERE L.ID = 2
    ) INSERT INTO #TEMPORAL SELECT
        T1.ID,
        T2.ID,
        T1.DATA,
        T2.DATA
    FROM TABLE1 T1
        INNER JOIN TABLE2 T2
            ON T2.ID2 = T2.ID2;
    --
    --this take a lot of resources proces and time and be come a status suspend, this why i need a temporal table.
    SELECT
        *
    FROM #TEMPORAL T
    WHERE T.DATA1 < T.DATA2
    --
    --IMPORTANT DROP THE TABLE.
    DROP TABLE #TEMPORAL
    
    .

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top