2009-03-31 7 views
3

SQL Server 2008に在庫ティックを格納するテーブルがあります。これは、シンボル列とdatetime2であるdatecolumnに基づいています。 C#アプリでは、挿入がテーブルに高速で送信されます。現在、行はシンボルとDateTime.Nowを使用して作成され、挿入されます。事実、同じシンボルの2ティックが入り、datetime.nowがミリ秒まで同じ時間を返す状況が発生する可能性があります。 私の質問は、私のインサートが与えられたシンボルに対して同じ時間を使用しないようにする方法です。私は1つの解決策としてローバーやオートナンバーのような別のユニークなキーをデータベースに持たせることができましたが、インサートが成功したとしても、与えられたシンボルの複製回数は必要ありません。私はまた、最後の挿入時間を格納し、それが等しい場合にはミリ秒を追加することも考えました。私はこれについて最善の方法を行くのか分からない。また、datetime2の継ぎ目は.netの日時よりも前もっているので、サーバーやクライアントでこれを解決しようとするべきかどうかはわかりません。私はすべてが関係なく、私は前の値をチェックして行きたくないので、私は一緒に行くだろうソリューションは、ID列が何であるかとパフォーマンス上の理由のために挿入しないで残しておきたいdatetime2列の挿入をユニークに保つ方法

おかげ

。これにより、datetime2で重複を許しながら挿入の順序を保持することができます。

答えて

2

キーでdatetimeを使用しないでください。

プライマリキーとしてID列を使用し、tick + datetimeにインデックス(必要に応じてクラスタ化可能)を配置します。私はあなたがdupsで何を望んでいるのか分からないが、この方法であなたは彼らが起こったことを記録することができるでしょう...

1

私はこのことに対する答えは、シンボルがまったく同じ時刻に来る場合に何をしたいかによって決まると思いますか?

シンボルとdatetime列に一意のインデックスを作成できますが、これにより、2つのインスタンスのいずれかに一意のキー違反が発生します。あなたがパフォーマンスのために設計しているなら、これは高価な行為かもしれません。

もう1つの方法はタイムスタンプ列を持つことです。これにより、まったく同じ時刻に2つの同一のシンボルが得られても、挿入が失敗しないことが保証されます。

実際の質問は、 - その2番目の同一のシンボルで何をしたいですか?書かれる前に同じシンボルとdatetimeがすでにテーブルに存在するかどうかをチェックするための費用はかかりますか?だから、あなたはログに記録し、重複を破棄することができますか?

+0

は、まあ、私はそのように、どんな実質貿易をテーブル内の重複を記録しないようにしたいSYSDATETIME()への自動生成プロパティを設定することで、私は時間が正確に正しいかどうかを気にいけませんしたがって、ミリ秒を追加することは大丈夫です、私はちょうどそれが近づいて、可能な限りパフォーマンスの良い方法で注文を保存したいと思っています – RBear

0

データベースにスレッドセーフが挿入されていますか?私。 2つのインサートが同時に起こり、お互いに気づかない可能性がありますか?この場合、最も高い値を格納し、ミリ秒を追加することはできません。

コリジョンが発生した場合に、時間が経過して増分する通常の手順が必要な場合があります。

1

DateTime.Nowは、スレッドセーフです2つの同じ値を返すことができます。 Datetime2列の自動生成プロパティを使用する方がよいでしょう。

編集:...

+0

それは一意であることが保証されていません。 –

関連する問題