93

SequenceOracleやPostgresと同じように、SQLServer2012が新機能として導入されました。アイデンティティよりもシーケンスが優先される場所はどこですか?そして、なぜシーケンスが必要なのですか?

4

6 に答える 6

84

私はあなたがここであなたの答えを見つけると思います

列のID属性を使用すると、自動インクリメント番号(主キーとしてよく使用される)を簡単に生成できます。Sequenceを使用すると、挿入中にテーブル列にアタッチできる別のオブジェクトになります。Identityとは異なり、列値の次の数値はディスクからではなくメモリから取得されます。これにより、SequenceはIdentityよりも大幅に高速になります。これは、次の例で確認します。

そしてここに

シーケンス:シーケンスはSQL Serverコミュニティから何年にもわたって要求されており、このリリースに含まれています。シーケンスは、数値のシーケンスを生成するユーザー定義のオブジェクトです。シーケンスを使用した例を次に示します。

そしてここでも:

SQL Serverシーケンスオブジェクトは、SQLテーブルのID列と同じように番号のシーケンスを生成します。ただし、シーケンス番号の利点は、シーケンス番号オブジェクトが単一のSQLテーブルに制限されないことです。

また、msdnでは、使用法とその必要性について詳しく読むことができます(ここ):

シーケンスは、シーケンスが作成された仕様に従って数値のシーケンスを生成する、ユーザー定義のスキーマバインドオブジェクトです。数値のシーケンスは、定義された間隔で昇順または降順で生成され、要求に応じて循環(繰り返し)される場合があります。ID列とは異なり、シーケンスはテーブルに関連付けられていません。アプリケーションは、シーケンスオブジェクトを参照して、次の値を受け取ります。シーケンスとテーブルの関係は、アプリケーションによって制御されます。ユーザーアプリケーションは、シーケンスオブジェクトを参照し、複数の行とテーブルにわたって値キーを調整できます。

シーケンスは、CREATE SEQUENCEステートメントを使用して、テーブルとは独立して作成されます。オプションを使用すると、増分、最大値と最小値、開始点、自動再起動機能、およびキャッシュを制御してパフォーマンスを向上させることができます。オプションについては、CREATESEQUENCEを参照してください。

行が挿入されるときに生成されるID列の値とは異なり、アプリケーションは、NEXT VALUE FOR関数を呼び出すことにより、行を挿入する前に次のシーケンス番号を取得できます。シーケンス番号は、番号がテーブルに挿入されていない場合でも、NEXTVALUEFORが呼び出されたときに割り当てられます。NEXT VALUE FOR関数は、テーブル定義の列のデフォルト値として使用できます。sp_sequence_get_rangeを使用して、複数のシーケンス番号の範囲を一度に取得します。

シーケンスは、任意の整数データ型として定義できます。データ型が指定されていない場合、シーケンスはデフォルトでbigintになります。

于 2012-04-08T11:23:17.803 に答える
23

シーケンスとIDはどちらも自動番号の生成に使用されますが、主な違いは、IDはテーブルに依存し、シーケンスはテーブルから独立していることです。

自動番号をグローバルに(複数のテーブルで)維持する必要があるシナリオがある場合は、特定の番号の後に間隔を再開する必要があり、パフォーマンスのためにもそれをキャッシュする必要があります。ここでは、シーケンスが必要であり、身元。

于 2012-05-01T06:54:20.637 に答える
16

シーケンスはID列よりも柔軟性がありますが、パフォーマンス上の利点はありませんでした。

IDを使用したパフォーマンスは、バッチ挿入にシーケンスを使用した場合よりも一貫して3倍高速であることがわかりました。

約150万行を挿入したところ、パフォーマンスは次のとおりでした。

  • アイデンティティのための14秒
  • シーケンスに45秒

テーブルのデフォルトを介してシーケンスオブジェクトを使用するテーブルに行を挿入しました。

NEXT VALUE for <seq> for <col_name>

また、selectステートメントでシーケンス値を指定してみました。

SELECT NEXT VALUE for <seq>, <other columns> from <table>

どちらも、同一性の方法よりも遅い同じ要因でした。シーケンスにはデフォルトのキャッシュオプションを使用しました。

Arionの最初のリンクで参照されている記事は、行ごとの挿入のパフォーマンスを示しており、IDとシーケンスの違いは10,000挿入で16.6秒から14.3秒でした。

キャッシングオプションはパフォーマンスに大きな影響を与えますが、ボリュームが大きいほど(+ 1M行)IDが高速になります

utly4lifeのコメントによる詳細な分析については、このリンクを参照してください。

于 2014-08-06T11:47:45.733 に答える
8

私はこれが少し古いことを知っていますが、私を噛んだ観察を追加したいと思いました。

IDからシーケンスに切り替えて、インデックスを順番に並べました。後で、シーケンスがレプリケーションで転送されないことを知りました。シーケンスが同期していなかったため、2つのデータベース間でレプリケーションを設定した後、キー違反が発生し始めました。決定を下す前に注意すべき点があります。

于 2018-04-25T14:57:03.780 に答える
3

シーケンスの最適な使用法は、ID列を置き換えるのではなく、「注文番号」タイプのフィールドを作成することです。

言い換えると、注文番号はエンドユーザーに公開され、ビジネスルールが付随している場合があります。一意にする必要がありますが、ID列を使用するだけでも実際には正しくありません。

たとえば、注文タイプが異なれば、必要なシーケンスも異なる可能性があるため、社内注文ではなく、インターネット注文のシーケンスが必要になる場合があります。

言い換えると、シーケンスをIDの単純な代替とは考えず、IDがビジネス要件に適合しない場合に役立つと考えてください。

于 2019-03-17T23:29:00.160 に答える
1

最近、アイデンティティとシーケンスについて考慮すべきことが少しありました。ギャップなしでアイデンティティを維持したい場合は、MSFTがシーケンスを提案するようになりました。IDに大きなギャップがあるという問題がありましたが、強調表示されたこのステートメントに基づいて、SQLがIDをキャッシュし、再起動後にそれらの番号を失ったという問題を説明します。

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017

サーバーの再起動またはその他の障害後の連続した値– SQL Serverは、パフォーマンス上の理由でID値をキャッシュする場合があり、データベースの障害またはサーバーの再起動中に割り当てられた値の一部が失われる可能性があります。これにより、挿入時にID値にギャップが生じる可能性があります。ギャップが許容できない場合、アプリケーションは独自のメカニズムを使用してキー値を生成する必要があります。NOCACHEオプションを指定してシーケンスジェネレーターを使用すると、コミットされないトランザクションへのギャップを制限できます。

于 2018-09-22T02:10:00.847 に答える