私の質問を説明するために、以下は、データウェアハウスに挿入されていないオーダーのIDを検出して挿入するクエリです。
With NewOrders
As
(
Select OrderID From Orders
Except
Select OrderID From FactOrders
)
Insert Into FactOrders(OrderID, OrderDate, CustomerId)
Select OrderID, OrderDate, CustomerId From Orders
Where OrderID in (Select OrderID from NewOrders);
クエリが初めて実行され、Orders
に4億行以上が含まれているとします。
SQL Serverは、1つのINSERT
ステートメントでこの数の行を処理できますか?
そうでない場合、どうすればよいですか? INSERT
ステートメントでフェッチされる行数を制限する必要がありますか? 1つのINSERT
ステートメントで、エンジンはいくつの行を処理できますか?
ドキュメント によると、テーブルごとに格納される行数の唯一の制限は次のとおりです
利用可能なリソースによってのみ制限されます
これが潜在的に含むローカルリソースは何ですか?
単一のSELECTステートメントがどれだけ抽出できるかについては、これに関連するドキュメントを直接見つけることはできませんが、これを上記とまったく同じにしても安全だと思います。
リソースに関連する場合を除いて、行の制限はないようです。 SQL Serverに本当に5億行を挿入するのに十分なリソースがある場合、それはそれを行います。以前は、このようなリソースの制約に直面していたため、結果セットを制限するWHERE句を追加しました。または、SELECTにTOPを指定してINSERTを再帰的に実行します。
With NewOrders
As
(
Select OrderID From Orders
Except
Select OrderID From FactOrders
)
Insert Into FactOrders(OrderID, OrderDate, CustomerId)
Select **TOP 1000000** OrderID, OrderDate, CustomerId
From Orders
Where OrderID in (Select OrderID from NewOrders);