SQL 2005 Server データベース (XP SP3 上) に高速でデータを挿入するプログラムを試しています。(これは、デザインのさまざまな側面を評価できるようにタイミング データを収集するためのものです)。
私の基本的なセットアップには、次のようなテーブルへのデータの挿入が含まれます (そして、ペイロード フィールドを指定するだけの SP を使用します)。
create table data
(
Id int PRIMARY KEY Identity,
payload datatime not null,
inserted datetime default (getdate()) not null
)
両方の日時フィールドにも UNIQUE 制約があることに注意してください。
クライアント プログラムで、.Net DateTime.Now 値の精度 (およびおそらくスレッド スリープも) に問題があったようなタイトなループで SP を呼び出していたため、ペイロードの一意の制約に違反していました。ストップウォッチ変数、Thread.Sleep() のビット、手動で「ペイロード」データを作成して、SQL DateTime フィールドの解像度 (3.3 mS) に違反しないようにすることで対処しました。
ただし、挿入が 5 ミリ秒から 10 ミリ秒の速度で生成されると、SQL 側の「挿入済み」フィールドで、一意のキー違反のために行が定期的に拒否されるという問題が発生し始めました。この問題がなくなるのは、挿入レートを 15 ミリ秒以上に落としたときだけです。このレートは、.Net DateTime.Now で発生した精度の問題に疑わしいほど似ているため (どこかの投稿で 16mS を読みました)、SQL Getdate() 関数の実際の精度はどうなのか疑問に思っています。
誰かが GetDate() を支えているものを教えてもらえますか?それは .Net DateTime.Now 値と同じソースに結び付けられますか? そして、どのような精度を期待する必要がありますか?
余談ですが、私は SQL 2008 サーバーの DATETIME2 型について知っているので、そのシステムでの GetDate() の精度についても疑問が生じます。