5

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() の精度についても疑問が生じます。

4

2 に答える 2

2

DATETIME の精度は 3.3 ミリ秒ですが、ご存じのように GETDATE() はこれほど正確な時間を返しません。新しい型/関数の仕組みの詳細については、日付/時刻型/関数の MSDN ページを確認してください。

于 2010-07-31T23:13:34.287 に答える
1

DATETIME2 つの整数として格納されます。1 つは日付部分を表し、もう 1 つは時刻部分 (午前 0 時以降のティック数) を表し、各ティックは 1/300 秒であるため、少なくとも理論上の精度は 3.3 ミリ秒です。

これを自分のマシンで実行してみました

declare @d  varchar(24)

while 1=1 
begin
set @d=CONVERT(VARCHAR(24), GETDATE(), 113)
raiserror('%s',0,1, @d) with nowait
end

そして、一度に 1 ティックずつ上昇するかなり長いランを取得したので、それを達成することを妨げる固有の制限はないと思います。

01 Aug 2010 00:56:53:913
...
01 Aug 2010 00:56:53:913
01 Aug 2010 00:56:53:917
...
01 Aug 2010 00:56:53:917
01 Aug 2010 00:56:53:920
...
01 Aug 2010 00:56:53:920
01 Aug 2010 00:56:53:923

SQL Server 2008 の精度に関するクエリに関してGetDate()は、これは SQL2005 の場合と同じです。sysdatetimeより高い精度を意図しています。以下を実行してみましたが、2 つの結果の不一致に驚きました。

SET NOCOUNT ON

CREATE TABLE #DT2(
[D1] [datetime2](7) DEFAULT (getdate()),    
[D2] [datetime2](7) DEFAULT (sysdatetime())
) 
GO

INSERT INTO #DT2
          DEFAULT  VALUES
GO 100

SELECT DISTINCT [D1],[D2],DATEDIFF(MICROSECOND, [D1], [D2]) AS MS
 FROM #DT2

結果

D1                           D2                              MS
----------------------------    -----------------------      ------
2010-08-01 18:45:26.0570000   2010-08-01 18:45:26.0625000     5500
2010-08-01 18:45:26.0600000   2010-08-01 18:45:26.0625000     2500
2010-08-01 18:45:26.0630000   2010-08-01 18:45:26.0625000     -500
2010-08-01 18:45:26.0630000   2010-08-01 18:45:26.0781250     15125
2010-08-01 18:45:26.0670000   2010-08-01 18:45:26.0781250     11125
2010-08-01 18:45:26.0700000   2010-08-01 18:45:26.0781250     8125
于 2010-07-31T23:09:44.930 に答える