web-dev-qa-db-ja.com

INSERTを高速化する

最小限の期間で、高速で同期的にテーブルに挿入する方法が必要です。私が試したこと(「ブラインド」)は:

  • テーブルにインデックスがまったくない
  • 単純なログに切り替えます(完全なログから)

私が使用するテストシナリオは、100の接続で構成され、それぞれがINSERTを実行し、0.1秒待ってから、再び無期限に待機します。各「挿入子」は実行時間を記録します。

実行時間を見ると、(例外として)挿入に1.5秒、さらには10秒が表示される場合があります。それ以外の場合、典型的な0.2秒が表示されます。

追加のコンテキスト:

  • SQL Server 2008 R2 Express(高速バージョンでは、DBサイズ(4GB)、RAM(1GB)および論理CPU(1))のみが制限されます)
  • マシン:7200 RPM HDD、8 GB RAMおよび8つの論理CPUを搭載し、サーバーとクライアントをホストするラップトップ
  • テーブルは、1つのBigInt ID(ID)、NVARCHAR(100)フィールド、およびNVARCHAR(MAX)(これに対するINSERTは10kのペイロードを持ちます)、およびNVARCHAR(MAX)(30kのペイロードはINSERT)列で構成されます

そのようなプロセスのパフォーマンスのさらなる改善点はどこにあるべきですか?

7
Andrei Rînea

多くの人々がコメントに多くの良い点を追加しました。

1)トランザクションログを別のドライブに分離します。それはラップトップでは難しいでしょう。それができない場合は、ラップトップ用のSSDを手に入れてください。そうすれば、あなたの生活はかなり良くなるはずです。

2)データとログファイルを事前に目標量まで拡張します。 1GBのデータをデータベースに追加する予定がある場合は、開始するためにデータとログファイルを少なくとも1.5GBにしてください。データとログファイルの自動拡張はパフォーマンスに大きな影響を与え、パフォーマンスにこれらの10秒間の「チョーク」が見られる理由となる可能性が非常に高いです。 SQL Management Studioにはいくつかの組み込みレポートがあります(DBを右クリックして[レポート]-> [ディスク使用状況]を選択すると思います)。そこには、すべての自動拡張イベントのテーブルがあります。)

3)クライアントごとに挿入をバッチ処理できる場合は、SqlBulkCopyまたはBULK INSERTステートメントを使用してバッチ処理します。

4)テーブルにクラスター化された主キーを設定してはならない理由はありません。 SQL Serverは、IDENTITY列のクラスター化インデックスをかなりパフォーマンスの高い方法で処理できる必要があります。

6
Dave Markle

私のアドバイスは、ラップトップを降りることです。これを、高速ドライブと大量のRAMを備えた実際のマシンに配置します。

1
datagod