SQL Server进程永不结束
我在sql server中有一个似乎永远不会结束的过程。为了发现这个过程中是否有块,我使用了SQL Server进程永不结束,sql,sql-server,database,Sql,Sql Server,Database,我在sql server中有一个似乎永远不会结束的过程。为了发现这个过程中是否有块,我使用了EXEC sp_who2,我看到SPID是197 状态为runnable,没有阻塞。命令正在插入。奇怪的是CPU时间是最大的:68891570和磁盘IO操作:16529185 此过程截断两个表,然后将另一个表中的数据插入这两个表中。确实有很多信息(原始表中有101962758行),但我认为时间太长了 我能做些什么来加速这个过程或发现正在发生的事情 谢谢从您提供的信息来看,查询似乎仍在运行 此过程截断两个表
EXEC sp_who2
,我看到SPID是197
状态为runnable,没有阻塞。命令正在插入。奇怪的是CPU时间是最大的:68891570和磁盘IO操作:16529185
此过程截断两个表,然后将另一个表中的数据插入这两个表中。确实有很多信息(原始表中有101962758行),但我认为时间太长了
我能做些什么来加速这个过程或发现正在发生的事情
谢谢从您提供的信息来看,查询似乎仍在运行 此过程截断两个表,然后将另一个表中的数据插入这两个表中。确实有很多信息(原始表中有101962758行),但我认为时间太长了 假设您的表是
Main
、T1
、T2
,您是否可以遵循以下流程(而不是您的方法)
从main选择*进入t1\u dup,t2\u dup
将t1、t2重命名为t1dup、t2dup
将t1\u dup、t2\u dup重命名为t1、t2
放下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
执行计划
这有助于确定实际查询中发生了什么。可以找到更多信息
性能提示
- 索引。删除所有索引,插入所需的索引除外(
)SELECT-INTO
- 约束和触发器。把它们从桌子上拿开
- 选择好的聚类索引。新记录将插入表的末尾
- 填充因子。将其设置为0或100(与0相同)。这将减少数据分布的页面数
- 。将其更改为
Simple
考虑审查。审查执行计划和代码本身。你有什么索引等等。我不知道,但你可以通过显示这些表(源和目标)的结构(包括主键/外键)、插入查询、这些表的所有索引以及执行计划来加速获取答案的过程。谢谢你的详细回答。我想问一个问题,第一个查询找到现在执行的前10个查询?例如,第二个昂贵的查询是我的过程之一,但最后一次执行时间是2016-11-18 04:37:26.487。看来它现在不运行了。。。没有办法知道程序的哪一步是执行?没有。它是所有查询的统计数据(昂贵),您可以选择所需的顺序。为了找出到底是什么导致了这个问题-执行计划。我有程序执行计划。我怎么知道我在找什么?例如,第二个更昂贵的查询在索引插入中有44%的成本,所以也许下次我应该删除索引,但现在它没有运行。我不知道过程中正在执行的步骤。这需要一些时间。请参阅此答案中的链接。你能发布一份执行计划吗?