tsql 程序永遠執行…它在做什麼
為了創建一個大型測試數據庫,我創建了一個 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 Machanic
sp_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