質問

私は、それを作る方が良いかどうかについて議論の真っin中にいます PRIMARY KEY から ID列, 、一意のIDを明示的に生成するUDFから。

  • 私はアイデンティティ列を議論しています。
  • 私のパートナーは手動で価値を生み出すと主張している、と彼は主張する
    • UDFを別のテーブルに置くことにより、UDFを持つことができます
      • リソースをロックします
      • 1つのフィールドが呼び出されたIDテーブルをインクリメントします ID_Value1
      • これをグローバルな一意の識別子として使用します
    • または、テーブルにしてもらいます id+1 挿入するとき
    • 識別制約がないサーバーおよび/または環境間でデータを移動する方が簡単であること。データがある1つのDBから別の同様のDBに移動して、ステージングまたはダミーデータを使用してください。非生産でのテストのために、昨日からテストのためのステージングにすべてのレコードを引き下げたいかもしれません。

どの実装がより理にかなっていますか?

役に立ちましたか?

解決

あなたの同僚はばかです。

ソリューションはスケーラブルではなく、UDFは並行していません(これと同じ理由)。そして、マルチローのインサートをどのように扱いますか:これには行ごとのUDF呼び出しが必要です

また、他のRDBMSに移行すると、実際の生活では頻繁には発生しません...今すぐSQLサーバーを使用しておらず、Oracleでシーケンスを使用しても、移住しないことを願っています。

編集:

更新は、移動データは非生産データベースを更新するためのものであると述べています。

その場合、リフレッシュするときはID列を無視します。非生産の負荷を容易にするために、実装を妥協しません。または、一時テーブルを使用して、ID値の変更を追跡します。

またはプロセスを使用する:私たちは、問題を完全に回避する生産から毎晩テストシステムを更新します。 (そして、私たちの製品のバックアップも復元できるようにします)

他のヒント

ID値を使用します。独自のシーケンステーブルとシーケンス値を生成すると、多くのオーバーヘッドがかかり、数値を生成しようとしながら多くのロックとブロックが発生します。

アイデンティティは理由で存在し、それを使用します。

SQL Denaliが出てくると、アイデンティティよりも効率的なシーケンスがサポートされますが、自分でより効率的なものを作成することはできません。

ある環境から別の環境にレコードを移動することに関しては、挿入時にID_INSERTをオンにするか、SSISのボックスをチェックします。

アイデンティティの列は私にはうまく聞こえます。サーバー間でデータを移動するのが難しい理由についてのロジックに従うかどうかはわかりません。

各行にグローバルにユニークなアイデンティティを持っている場合は、UUIDを使用できますが、グローバルな一意性が必要であると確信していない限り、私はそれをしません。通常はそうではありません。 UUIDをIDSとして使用すると、パフォーマンスが低下し、ディスクスペースの要件が増加し、デバッグが難しくなります。長さが覚えておくか、電話で誰かに伝えたり、エラーなしで紙に書き留めたりすることは困難です。

単純な数値IDの場合、アイデンティティを使用して、手動で生成するすべての問題を忘れてください。

いつでもPKとしてアイデンティティを使用し、タイプ列、およびその他の情報を持っている「スーパーテーブル」を作成できます。新しいIDが必要な場合(さまざまなテーブル間で一意のIDを意味すると仮定して)このテーブルに挿入してつかむだけです SCOPE_IDENTITY() 次に、必要な実際のテーブルに挿入します。

基本的にテーブルを作成します。 masterids アイデンティティPKを使用すると、Table1に行を挿入する必要がある場合、 INSERT INTO MasterIDs そして、その行によって生成されたIDを使用して取得します SCOPE_IDENTITY() そして、挿入します 表1 その値をPKとして使用します。

表1 非同一性int pkがあります。 Table2などに挿入するために同じプロセスを行います。SQLサーバーにIDの値を管理させます masterids テーブル、他のテーブルで使用できます。 masterids タイプのような他のテーブルを含めることができます(そのため、テーブル、Table1、またはTable2などがそのアイデンティティ値を使用するかを知ることができます。

Asyouが外部キーの制約を適切に使用している限り(カスケード、更新など)、IDフィールドを使用することは問題ありません。この場合、私は他の解決策に本当に利点がありません。

シナリオに合うようにアイデンティティが作成されました。サーバー/環境のデータ交換のレプリケーションなどのツールがあり、それをすべてまとめることができます。

SQLサーバーを交換した作業を終えたばかりです identity 正常な列 int フィールドと制御されたID割り当てで。

私は非常に印象的なパフォーマンスの向上を見てきました。 OPとは異なり、IDを生成するUDFがありません。しかし、原則はほとんど同じです。IDのプールを維持するソフトウェアの一部があります。彼らが使い果たしたとき、それは次のデータベースのためにデータベースをクエリすることで別のバッチを取得します 低い これを次のものに値と増分します 高い.

これにより、データベースにバッチを送信する前に、ORMのトランザクション外のすべてのエンティティを生成し、すべてのエンティティを関連付けることができます。また、IDの挿入(ID列で必要)を取得するために追加の丸いトリップなしで大きなバッチを送信できます。

IDテーブルには、複数の行があり、必要に応じて特定の範囲を使用できるようになります。削除されたブロックとネガティブIDを再利用するためのIE。

私は何年もIDを使用しており、IdentididefierにID番号を置き換えることを真剣に検討しています。誰かがコンパクトなDBと悪夢に設計されている場合、データ型を変更する必要がある場合は、列にIDを追加する必要がある場合は悪夢です。また、ID列を更新することはできません。 INTを入れて、データベースが200億の記録を超えて成長すると想像してください。アイデンティティで何かを変えることは悪夢であり、あなたがbigintを置かない限り、スケールフレンドリーではありません! Asiquientidentifier vs ID =利便性と堅牢性vs顕著なパフォーマンス改善(ベンチマークは行われませんでした)。

更新:見た後 これ 私は間違いなくuniqueidentifierに傾いています。これは、Bigintのアイデンティティの本当の利点と、uniqueidentifierのための多くの利点を示していません! SQL Serverの異なるバージョンは、異なる結果をもたらす可能性があります。すべてのデータベースとシステム(堅牢性)にユニークなIDを持つことには美しさがあります!あなたが好きなようにデータを移動、コピー、変換してください!https://www.mssqltips.com/sqlservertip/5105/sql-server-performance-comparison-int-versus-guid/

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