Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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查询按顺序运行时速度较慢,但单独运行时速度较快_Sql_Sql Server - Fatal编程技术网

SQL查询按顺序运行时速度较慢,但单独运行时速度较快

SQL查询按顺序运行时速度较慢,但单独运行时速度较快,sql,sql-server,Sql,Sql Server,我有一个表,我将使用来自不可变XML列的xquery的昂贵计算值填充该表。为了加快部署到生产环境,我在测试服务器上预先计算了值,并用BCP保存到一个文件中 我的剧本如下 -- Lots of other work, including modifying OtherTable CREATE TABLE FOO (...) GO BULK INSERT FOO FROM 'C:\foo.dat'; GO -- rerun from here after the break INSERT I

我有一个表,我将使用来自不可变XML列的xquery的昂贵计算值填充该表。为了加快部署到生产环境,我在测试服务器上预先计算了值,并用BCP保存到一个文件中

我的剧本如下

-- Lots of other work, including modifying OtherTable

CREATE TABLE FOO (...)
GO

BULK INSERT FOO
FROM 'C:\foo.dat';
GO

-- rerun from here after the break

INSERT INTO FOO 
  (ID, TotalQuantity)
SELECT 
e.ID, 
SUM(e.Quantity) as TotalQuantity
FROM (select 
    o.ID,
    h.n.value('TotalQuantity[1]/.', 'int') as TotalQuantity
FROM dbo.OtherTable o
    CROSS APPLY XmlColumn.nodes('(item/.../salesorder/)') h(n)
WHERE o.ID NOT IN (SELECT DISTINCT ID FROM FOO)
) as E
GROUP BY e.ID
在ManagementStudio中运行脚本时,前两条语句在几秒钟内完成,但最后一条语句需要4小时才能完成。由于自my foo.dat计算以来未向OtherTable添加任何行,因此management studio报告0行受影响


如果我在几分钟后取消查询执行,只选择最后一个查询并单独运行,它将在5秒钟内完成

值得注意的事实:

OtherTable包含200000行,XmlColumn中的数据非常大,表的总大小约为3GB FOO表得到130万行 有什么可能造成不同? Management studio已关闭隐式事务。据我所知,每条语句都将在自己的事务中运行

更新:
如果我首先选择并运行脚本,直到中断后从这里重新运行,然后选择并运行最后一个查询,那么它仍然很慢,直到我取消执行并重试。这至少排除了与脚本中的前一个代码一起运行的任何影响,并归结为相同的查询在第一次执行时速度较慢,在所有其他条件相同的情况下在第二次运行时速度较快。

可能有不同的执行计划。请参阅。

这可能与新创建的Foo表上的统计数据完全错误有关吗?如果SQL Server在第一次运行查询时自动更新统计信息,则第二次运行将根据最新统计信息创建其执行计划

如果在大容量插入后立即使用函数检查统计信息,然后在取消长时间运行的查询后再次检查统计信息,该怎么办?即使查询被取消,统计数据是否得到更新


在这种情况下,在大容量插入之后立即执行on-Foo可能会有所帮助。

不确定为什么它会有帮助,但我将最后一个查询重写为左外部联接,突然执行时间下降到15毫秒

INSERT INTO FOO 
  (ID, TotalQuantity)
SELECT 
e.ID, 
SUM(e.Quantity) as TotalQuantity
FROM (select 
    o.ID,
    h.n.value('TotalQuantity[1]/.', 'int') as TotalQuantity
FROM dbo.OtherTable o
INNER JOIN FOO f ON o.ID = f.ID
    CROSS APPLY o.XmlColumn.nodes('(item/.../salesorder/)') h(n)
WHERE f.ID = null
) as E
GROUP BY e.ID

你能看到执行计划有什么不同吗?最后一条语句耗时4小时,您可以查看估计的计划,而不是实际的计划,至少可以开始一段时间。如果我在几分钟后取消查询执行,只选择最后一条查询并单独运行,它将在5秒内完成。-您是自己运行select,将结果插入到空的foo中,还是将结果插入到aleady填充的foo中?foo主要是从BCP进程还是从OtherTable的insert中获取130万行?@MarkBannister,我正在运行select并填充表。我只是从按下cancel的那一点开始继续相同的脚本。所有130万行均来自批量插入。这就是受影响的0行所表示的。我曾经获取缓慢运行查询的执行计划,但据我所知,它在我第二次运行查询时使用了相同的执行计划。不幸的是,除非等待4个小时,否则我无法获得我感兴趣的每个部分的执行计数xpath求值的数量。我将尝试让查询在一夜之间运行,以获得完整的执行计划。此外,为什么执行计划会在Management Studio的两次相同调用之间更改,而其间没有其他活动?为什么执行计划会在以下两次调用之间更改:stats执行查询后,FOO表的PK的stats日期为null。听起来是个可能的解决办法。但是,通过将查询重写为左外部联接,我成功地获得了合理的执行时间。