web-dev-qa-db-ja.com

SQL Serverは1つのINSERTステートメントでテーブルに処理できる行数を教えてください。

私の質問を説明するために、以下は、データウェアハウスに挿入されていないオーダーの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ステートメントで、エンジンはいくつの行を処理できますか?

5

ドキュメント によると、テーブルごとに格納される行数の唯一の制限は次のとおりです

利用可能なリソースによってのみ制限されます

これが潜在的に含むローカルリソースは何ですか?

  • 記憶
  • 挿入されたデータを物理的に書き込むデータベースデータファイルのスペース
  • データベースログファイルのスペース
  • TempDBのスペース(データとログ)

単一のSELECTステートメントがどれだけ抽出できるかについては、これに関連するドキュメントを直接見つけることはできませんが、これを上記とまったく同じにしても安全だと思います。

17
George.Palacios

リソースに関連する場合を除いて、行の制限はないようです。 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);
3
user167159