質問

一意のIDを持つテーブルのセットを持つSQLデータベースがあります。長い間、一意の識別子データ型を使用し、C#インターフェイスからguidを渡してきました。ただし、クエリの速度を上げるために、bigintを使用してlongを渡すことに切り替えることにしました。

IDの重複がないようにコードを実行するたびに一意のlongを作成する最も簡単な方法は何ですか?

役に立ちましたか?

解決

bigintがデータベーステーブル内で一意であることを保証できる唯一の方法は、SQL Serverにbigintを生成させ、IDENTITY列にすることです。

uniqueidentifierでパフォーマンスを実際に測定しましたが、遅すぎることがわかりましたか?

他のヒント

速度が問題になる場合、newID()ではなくnewsequantialID()関数を使用して生成することにより、uniqueidentifierを使用する場合、クエリの改善を得ることができます。新しいメソッドは、連続した一意の識別子を生成します

どこで減速が見られますか?クエリまたは挿入/更新?主キーとしてのGUIDは、IDENTITYのようにシーケンシャルではなく、キーのクラスター化インデックスでスラッシングを引き起こす可能性があるため、挿入/更新には適していません。しかし、SQLServerにはそれを解決するシーケンシャルガイドがあります。 GUIDを低速のキーとして使用することについてよく耳にしますが、これがどれほど真実か疑問に思います。特に64ビットのマシンでは、64ビットまたは32ビットの数値を比較するよりも、128ビットの数値を比較する方が本当に遅いのですか?

シードのほかに、一意の番号を生成する他のオプションがあります。可能性の1つは、時間に基づいて数値を生成する(ティックなど)か、2009年の開始からの秒数をより良く計算することです。次に、場所(またはサーバーで実行していない場合はアカウント)に基づいて一意の数字を追加します)番号の最後まで作成されました(最下位桁)。

したがって、新しい一意の番号がアプリサーバー1 で作成され、IDが42で、2009年の開始から4000秒が経過した場合、新しい識別子は400042になります。 400942であり、異なるサーバーからまったく同時に生成されたものは400943です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top