SQL Server进程永不结束
我在sql server中有一个似乎永远不会结束的进程。要发现在这个过程中是否有块,我使用EXEC sp_who2
,我看到SPID是197.SQL Server进程永不结束
状态是可运行的,没有块。命令正在插入。奇怪的是CPU时间是最大的:68891570和磁盘IO操作:16529185.
此过程截断两个表,然后将数据从另一个表插入到这两个表中。确实有很多信息(原始表中的101962758行),但我认为时间太多了。
我能做些什么来加速这个过程或发现正在发生的事情?
谢谢
从您提供的信息,似乎查询仍在运行...
这个过程截断两个表,然后从另一个表中的数据插入到这两个表。确实有很多信息(原始表中的101962758行),但我认为时间太多了。
你可以按照下面的过程(而不是你的方法),假设你的表是Main
,T1
,T2
。
Select * into t1_dup,t2_dup from main
rename t1,t2 to t1dup,t2dup
rename t1_dup,t2_dup to t1,t2
drop t1dup,t2dup
这取决于具体的方案在这里。我建议采取以下步骤来决定下一步移动的位置。
找到最昂贵查询
使用下面的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
。
此外
感谢您的详细解答。我想问一下,第一个查询查找正在执行的前10个查询?例如,第二个昂贵的查询是我的程序之一,但last_execution_time是2016-11-18 04:37:26.487。看起来它现在没有运行......没有办法知道程序的哪一步是执行? – Maik
没有。这是所有查询(昂贵)的统计数据,您可以选择您需要的订单。为了找出究竟是什么造成的问题 - 去执行计划。 –
我有程序执行计划。如何表示我知道我在找什么?例如,第二个更昂贵的查询在索引插入中有44%的成本,所以也许下一次我应该放弃索引,但现在它没有运行。我不知道在该过程中正在执行的步骤。 – Maik
查看执行计划和代码本身。你有什么指数等等。 –
我不知道,但是你可以通过以下方式加速获取答案的过程:包括主键/外键和插入查询的表(包括源和目标)的结构以及这些表的所有索引和执行计划。 –