Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server进程永不结束_Sql_Sql Server_Database - Fatal编程技术网

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行),但我认为时间太长了 我能做些什么来加速这个过程或发现正在发生的事情 谢谢从您提供的信息来看,查询似乎仍在运行 此过程截断两个表

我在sql server中有一个似乎永远不会结束的过程。为了发现这个过程中是否有块,我使用了
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%的成本,所以也许下次我应该删除索引,但现在它没有运行。我不知道过程中正在执行的步骤。这需要一些时间。请参阅此答案中的链接。你能发布一份执行计划吗?