2016-11-18 42 views
-1

我在sql server中有一个似乎永远不会结束的进程。要发现在这个过程中是否有块,我使用EXEC sp_who2,我看到SPID是197.SQL Server进程永不结束

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

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

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

谢谢

+0

查看执行计划和代码本身。你有什么指数等等。 –

+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

这取决于具体的方案在这里。我建议采取以下步骤来决定下一步移动的位置。

找到最昂贵查询

使用下面的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

+0

感谢您的详细解答。我想问一下,第一个查询查找正在执行的前10个查询?例如,第二个昂贵的查询是我的程序之一,但last_execution_time是2016-11-18 04:37:26.487。看起来它现在没有运行......没有办法知道程序的哪一步是执行? – Maik

+0

没有。这是所有查询(昂贵)的统计数据,您可以选择您需要的订单。为了找出究竟是什么造成的问题 - 去执行计划。 –

+0

我有程序执行计划。如何表示我知道我在找什么?例如,第二个更昂贵的查询在索引插入中有44%的成本,所以也许下一次我应该放弃索引,但现在它没有运行。我不知道在该过程中正在执行的步骤。 – Maik