高価な計算の値(不変の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
を次のように
私のスクリプトですが、最後の文が完了するまでに4時間かかります。私のfoo.datは管理スタジオレポート(0 row(s) affected)
を計算して以来、OtherTable
に行が追加されていないためです。
数分後にクエリの実行を取り消し、最後のクエリだけを選択して別々に実行すると、5秒以内に完了します。
注目すべき事実:
- OtherTableは20万行とXmlColumn内のデータが含まれているかなり大きな、合計テーブルサイズ〜3ギガバイト
- あるFOOテーブルは何でし1.3M行
を取得おそらく違いを生み出すだろうか?
管理スタジオで暗黙的なトランザクションがオフになっています。私はそれぞれのステートメントがそれ自身のトランザクションで実行されることを理解できる限りです。
更新:
私が最初-- rerun from here after the break
までスクリプトを選択して実行すると、私は実行をキャンセルして再試行するまで、そしてちょうど最後のクエリを選択して実行し、それはまだ遅いです。これは、スクリプト内の前のコードと "一緒に"実行することの影響を排除し、同じクエリが最初の実行では遅く、2番目の実行では速くなります(他のすべての条件が同じで実行されます)。
実行計画に違いはありますか?最後の声明では4時間かかりますが、実際の計画ではなく、見積もり計画を見ることができます。 –
"数分後にクエリの実行をキャンセルし、最後のクエリだけを選択して実行すると、5秒以内に完了します。" - あなたはselectを単独で実行していますか?空のfooに結果を挿入するか、結果を空白のfooに挿入していますか?fooは主にBCPプロセスまたはOtherTableの挿入から1.3M行を取得しますか? –
@MarkBannister私がキャンセルしたポイントから同じスクリプトを続行しています。すべての1.3M行は一括挿入に由来します(これは '' 0行が影響を受けたものです) ')を示します。 –