SQL Server进程永远不会结束

时间:2016-11-18 08:30:51

标签: sql sql-server database

我在sql server中有一个似乎永远不会结束的进程。为了发现在这个过程中是否存在阻止,我使用EXEC sp_who2并且我看到SPID是197。

状态是可运行的,没有阻止。命令正在插入。奇怪的是CPU时间是最大的:68891570和DISK IO操作:16529185。

此过程截断两个表,然后将另一个表中的数据插入这两个表。确实有很多信息(原始表中有101962758行),但我认为时间太长了。

我可以做些什么来加快这个过程或发现正在发生的事情?

谢谢

2 个答案:

答案 0 :(得分:0)

根据您提供的信息,似乎查询仍在运行...

  

此过程截断两个表,然后将另一个表中的数据插入这两个表。确实有很多信息(原始表中有101962758行),但我认为时间太长了。

假设您的表格为MainT1T2,您可以按照以下流程(而非您的方法)。

  1. Select * into t1_dup,t2_dup from main

  2. rename t1,t2 to t1dup,t2dup

  3. rename t1_dup,t2_dup to t1,t2

  4. drop t1dup,t2dup

答案 1 :(得分:0)

这取决于此处的情况。我建议采用以下步骤来决定下一步的移动方式。

查找最昂贵的查询

使用以下SQL确定最昂贵的查询:

SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1),
 qs.execution_count,
 qs.total_logical_reads, qs.last_logical_reads,
 qs.total_logical_writes, qs.last_logical_writes,
 qs.total_worker_time,
 qs.last_worker_time,
 qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
 qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
 qs.last_execution_time,
 qp.query_plan
FROM sys.dm_exec_query_stats qs
 CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
 CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_logical_reads DESC -- logical reads
-- ORDER BY qs.total_logical_writes DESC -- logical writes
-- ORDER BY qs.total_worker_time DESC -- CPU time

执行计划

这有助于确定实际查询的内容。可以找到更多信息here

表现提示

  • 指标的影响。除了插入(SELECT INTO
  • 所需的索引之外,删除所有索引
  • 约束和触发器。将它们从桌子上移除。
  • 选择好的聚集索引。新记录将插入表格末尾。
  • 填充因子。将其设置为0或100(与0相同)。这将减少数据分布的页数。
  • Recovery model。将其更改为Simple

另外

考虑审核Insert into table select * from table vs bulk insert