Sql-Server

tsql 程序永遠執行…它在做什麼

  • May 9, 2017

為了創建一個大型測試數據庫,我創建了一個 SP,它使用預定義的表列表(我感興趣的 35 個)並將每個表中的數據相乘。

換句話說,一張表有一個商店的數據。我將相同的數據插入到該表中,但商店編號不同(這給了我 2 家商店)。然後我呼叫將 2 個儲存數據乘以 4 個儲存的同一個 SP,依此類推。週末,我開始處理 SP 的 6 次後續呼叫,認為當我周一回來時,我的數據庫將擁有 64 家商店的數據。不幸的是,事實並非如此……

當我周一進來時,我發現數據 HD 已滿,但該過程從未崩潰,似乎已暫停。我的數據庫處於簡單恢復模式,我通過移動文件和縮小 TempDB(通過 SSMS 中的縮小文件選項)騰出空間,並在外部驅動器上創建了一個初始大小為 100GB 的額外 ndf 文件……程序仍在執行(騰出空間後超過 24 小時)。

spid 的任務狀態顯示掛起,等待類型為 PAGEIOLATCH_EX,但等待時間很短(低於 100 毫秒),這讓我相信該程序仍在執行。

35 個表中有 34 個大小合適,並且可以快速相乘…該過程已將所有表中的 1 個數據儲存乘以 8 個儲存,並且仍在完成將數據從 8 個儲存乘以 16 個儲存的過程……它似乎正在處理的一張桌子是所有桌子中最大的……

將該表的數據從 8 個儲存乘以 16 個儲存的實際過程是從 4 億條記錄中選擇插入 4 億條記錄,並且該表有 200 個不同類型的列。

我在浪費時間等待嗎?恐怕殺死程序需要幾天才能回滾……我應該等待它嗎?它變成了一個幻象程序嗎?我怎麼知道它在做什麼?

任何意見/想法將不勝感激。

謝謝

如果您還沒有,請下載Adam Machanicsp_whoisactive編寫的儲存過程。使用選項執行。@get_full_inner_text = 0

從儲存過程的註釋部分:

– 如果為 1,則獲取完整的儲存過程或正在執行的批處理,如果可用

– 如果為 0,則僅獲取目前在批處理或過程中執行的實際語句

@get_full_inner_text = 0

執行此查詢,您應該會看到正在執行的實際語句和打開的會話活動:

   SELECT   r1.session_id,
        r5.TEXT,
        r1.internal_objects_alloc_page_count + r2.task_internal_objects_alloc_page_count     AS internal_objects_alloc_page_count,
        r1.internal_objects_dealloc_page_count + r2.task_internal_objects_dealloc_page_count AS internal_objects_dealloc_page_count,
        r1.user_objects_alloc_page_count + r2.task_user_objects_alloc_page_count             AS user_objects_alloc_page_count,
        r1.user_objects_dealloc_page_count + r2.task_user_objects_dealloc_page_count         AS user_objects_dealloc_page_count,
        r3.client_net_address,
        r4.host_name,
        r4.program_name,
        r4.last_request_start_time,
        r4.last_request_end_time,
        r4.login_time,
        r4.cpu_time,
        r4.memory_usage,
        r4.reads,
        r4.writes,
        r4.logical_reads,
        r4.status,
        r4.login_name,
        r4.nt_domain,
        r4.nt_user_name,
        (SELECT Count(1)
         FROM   sys.dm_tran_session_transactions t1
         WHERE  t1.session_id = r1.session_id) AS open_transactions
FROM     sys.dm_db_session_space_usage AS r1,
        (SELECT   session_id,
                  Sum(internal_objects_alloc_page_count)   AS task_internal_objects_alloc_page_count,
                  Sum(internal_objects_dealloc_page_count) AS task_internal_objects_dealloc_page_count,
                  Sum(user_objects_alloc_page_count)       AS task_user_objects_alloc_page_count,
                  Sum(user_objects_dealloc_page_count)     AS task_user_objects_dealloc_page_count
         FROM     sys.dm_db_task_space_usage
         WHERE    session_id > 50
         GROUP BY session_id) AS r2,
        sys.dm_exec_sessions r4,
        sys.dm_exec_connections r3
        OUTER APPLY sys.Dm_exec_sql_text(most_recent_sql_handle) r5
WHERE    r1.session_id = r2.session_id
        AND r3.most_recent_session_id = r2.session_id
        AND r3.most_recent_session_id = r4.session_id
        AND r1.session_id > 50
ORDER BY internal_objects_alloc_page_count DESC,
        user_objects_alloc_page_count DESC

引用自:https://dba.stackexchange.com/questions/173096