3,000 万行のデータベースがあります。PK クラスター化インデックスは、生成されたコードGUID
です。
表は次のとおりです。
CREATE TABLE [dbo].[events](
[imageEventGUID] [uniqueidentifier] NOT NULL,
[imageSHAID] [nvarchar](256) NOT NULL,
[queryGUID] [uniqueidentifier] NOT NULL,
[eventType] [int] NOT NULL,
[eventValue] [nvarchar](2050) NULL,
[dateOfEvent] [datetime] NOT NULL,
CONSTRAINT [PK_store_image_event] PRIMARY KEY CLUSTERED
(
[imageEventGUID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
簡単に言えば、画像検索エンジンです。
imageEventGUID
はコード固有の識別子です。imageSHAID
画像 URL の SHA256 です。queryGUID
コードで生成された FK です (簡潔にするために create ステートメントから除外されます)。eventType
イベントの種類に割り当てられた番号ですeventValue
通常、画像の URI です。たとえば、" http://mywebpage.com/images/image123456789.jpg "です。
かなり標準的なコードを使用して、定期的に via SqlBulkCopy
(from a ) をこのテーブルに挿入します。DataTable
using (SqlBulkCopy bulk = new SqlBulkCopy(storeConn, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.KeepNulls, null))
{
bulk.DestinationTableName = "[dbo].[events]";
bulk.WriteToServer(myeventsDataTable);
}
通常、1 回の一括挿入で 5k から 10k 行を挿入しようとしています。この一括コピーの挿入結果がひどいです。私はこの DB を SSD (SATA 1 のみが接続されている) で実行していましたが、非常に高速でした (500 ミリ秒未満)。SSD の空き容量がなくなったので、DB を 1TB 7200 キャッシュ回転ディスクに交換しました。完了時間が 120 秒 (120000 MS) を超えているためです。一括挿入が実行されているとき、約 1MB/秒のディスク アクティビティが見られ、CPU 使用率が低いことがわかります。
このテーブルには、PK 以外のインデックスはありません。
あなたへの私の質問は次のとおりです。
これを引き起こす原因となる、私が間違っていることは明らかですか?
「あなたの回転するディスクは、このサイズのDBには十分な速度ではありません」という単なるケースですか?
このデータの挿入で正確に何が起こっているのでしょうか? クラスター化されたインデックスであるため、挿入時にディスク上のデータ ページを再配置しますか? 本質的に順序付けされていない GUID を挿入しようとしているため、この「ランダムな挿入の性質」により、読み取り/書き込みヘッダーがディスク上の別のページに頻繁に移動する可能性がありますか?
御時間ありがとうございます。