我有一張表,我將用昂貴的計算值(使用來自不可變XML列的xquery)填充值。爲了加速部署到生產,我已經在測試服務器上預先計算了值,並將其保存到帶有BCP的文件中。按順序運行時SQL查詢速度慢,但在單獨運行時速度很快
我的腳本如下
-- 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
當我在Management Studio中的前兩行秒鐘之內完成運行腳本,但最後的語句需要4個小時才能完成。由於我的foo.dat是計算管理工作室報告(0 row(s) affected)
,因此沒有行被添加到OtherTable
。
如果我取消了兩三分鐘後,查詢執行,並選擇剛剛過去的查詢,並單獨運行它在5秒內完成這一點。
值得注意的事實:
- 的OtherTable包含20萬行和XmlColumn的數據是相當大的,總表的大小〜3GB
- foo表得到130萬行
有什麼事情可能會有所作爲?
管理工作室關閉了隱式交易。就我所能理解的,每條陳述都會在自己的交易中運行。
更新:
如果我先選擇並運行腳本,直到-- rerun from here after the break
,然後選擇並運行剛剛過去的查詢,它仍然是緩慢的,直到我取消執行,然後再試一次。這至少排除了與腳本中的前一代碼「一起」運行的任何效果,並歸結爲相同的查詢在第一次執行時速度慢,在第二次時速度很快(在所有其他條件相同的情況下運行)。
你可以看到在執行計劃的任何差異?最後一個陳述需要4個小時,你可以看看估計的計劃,而不是實際的(至少是一開始)。 – 2012-01-04 08:12:49
「如果我在幾分鐘後取消查詢執行並僅選擇最後一個查詢並單獨運行,它將在5秒內完成。「 - 你是否自己運行select,將結果插入空foo中或將結果插入到foo中?foo獲取大部分來自BCP進程的130M行還是來自OtherTable的插入? – 2012-01-04 08:49:41
@MarkBannister ,我正在運行帶有填充表的select,我只是從按下cancel的地方繼續使用同一個腳本,所有的1.3M行都來自批量插入(這就是'(0 row(s)affected) '表示)。 – 2012-01-04 09:08:45