- 04/11/2017
- 10 minutes to read
-
- W
- c
- r
- M
- m
-
+7
Applies to: SQL Server (all supported versions) Azure SQL Database
Creates a sequence object and specifies its properties. シーケンスは、シーケンスが作成された仕様に従って数値のシーケンスを生成するユーザー定義のスキーマバインドオブジェクトです。 数値のシーケンスは、定義された間隔で昇順または降順に生成され、使い果たされたときに再起動(サイクル)するように構成できます。 順序は、id列とは異なり、特定のテーブルに関連付けられません。 アプリケーションは、次の値を取得するためにsequenceオブジェクトを参照します。 シーケンスとテーブルの関係は、アプリケーションによって制御されます。 ユーザーアプリケーションは、シーケンスオブジェクトを参照し、複数の行とテーブル間で値を調整できます。
行が挿入されたときに生成されるid列値とは異なり、アプリケーションはNEXT VALUE FOR関数を呼び出すことによって、行を挿入せずに次のシーケンス番号 複数のシーケンス番号を一度に取得するには、sp_sequence_get_rangeを使用します。
CREATE SEQUENCEとNEXT VALUE FOR関数の両方を使用する情報とシナリオについては、シーケンス番号を参照してください。
Transact-SQL構文規則
構文
CREATE SEQUENCE sequence_name ] } | { NO MINVALUE } ] } | { NO MAXVALUE } ] } | { NO CACHE } ]
注
SQL Server2014以前のTransact-SQL構文を表示するには、以前のバージョ
引数
sequence_name
データベース内でシーケンスが認識される一意の名前を指定します。 型はsysnameです。
シーケンスオブジェクトの境界を指定します。 新しいシーケンスオブジェクトの既定の最小値は、シーケンスオブジェクトのデータ型の最小値です。 これは、tinyintデータ型の場合はゼロで、他のすべてのデータ型の場合は負の数です。
シーケンスオブジェクトが最小値(または降順シーケンスオブジェクトの最大値)から再起動するか、最小値または最大値を超えたときに例外をスロー New sequenceオブジェクトのデフォルトのcycleオプションはNO CYCLEです。
注
シーケンスの循環は、開始値からではなく、最小値または最大値から再起動します。
/NO CACHE]
シーケンス番号の生成に必要なディスクIOsの数を最小限に抑えることにより、シーケンスオブジェクトを使用するアプリケーションのパフォーマ デフォルトはCACHEです。
たとえば、キャッシュサイズが50を選択した場合、SQL Serverでは50個の個別の値はキャッシュされません。 現在の値とキャッシュに残っている値の数だけがキャッシュされます。 つまり、キャッシュを格納するために必要なメモリの量は、常にシーケンスオブジェクトのデータ型の2つのインスタンスであることを意味します。
注意
キャッシュサイズを指定せずにcacheオプションが有効になっている場合、データベースエンジンはサイズを選択します。 ただし、ユーザーは選択が一貫していることに依存しないでください。 Microsoftは、キャッシュサイズの計算方法を予告なく変更する場合があります。
CACHEオプションを指定して作成すると、予期しないシャットダウン(電源障害など)により、キャッシュに残っているシーケンス番号が失われる可能性
一般的な注意事項
シーケンス番号は、現在のトランザクションの範囲外で生成されます。 シーケンス番号を使用するトランザクションがコミットされるかロールバックされるかにかかわらず消費されます。 重複検証は、レコードが完全に入力された後にのみ実行されます。 これにより、作成時に同じ番号が複数のレコードに使用されても、重複として識別される場合があります。 これが発生し、他の自動番号値が後続のレコードに適用された場合、これにより自動番号値と予想される動作の間にギャップが生じる可能性があります。
キャッシュ管理
パフォーマンスを向上させるために、SQL ServerはCACHE引数で指定されたシーケンス番号の数を事前に割り当てます。
たとえば、開始値が1、キャッシュサイズが15の新しいシーケンスが作成されます。 最初の値が必要な場合は、値1~15がメモリから使用可能になります。 最後にキャッシュされた値(15)は、ディスク上のシステムテーブルに書き込まれます。 すべての15個の番号が使用されると、次の要求(番号16)により、キャッシュが再び割り当てられます。 新しい最後にキャッシュされた値(30)がシステムテーブルに書き込まれます。
22個の数値を使用した後にデータベースエンジンが停止した場合、メモリ内の次の意図されたシーケンス番号(23)がシステムテーブルに書き込まれ、前に格納されていた番号が置き換えられます。SQL Serverが再起動され、シーケンス番号が必要になった後、開始番号がシステムテーブルから読み取られます(23)。 15個の数値(23-38)のキャッシュ量がメモリに割り当てられ、次の非キャッシュ番号(39)がシステムテーブルに書き込まれます。
電源障害などのイベントでデータベースエンジンが異常停止した場合、シーケンスはシステムテーブルから読み取られた番号(39)で再起動します。 メモリに割り当てられたシーケンス番号はすべて失われます(ただし、ユーザーやアプリケーションによって要求されたことはありません)。 この機能はギャップを残す可能性がありますが、CYCLEとして定義されているか手動で再起動されない限り、単一のシーケンスオブジェクトに対して同じ値が二回発行されることはありません。
キャッシュは、現在の値(最後に発行された値)とキャッシュに残っている値の数を追跡することによって、メモリ内に維持されます。 したがって、キャッシュによって使用されるメモリの量は、常にシーケンスオブジェクトのデータ型の2つのインスタンスです。
cache引数をNO CACHEに設定すると、シーケンスが使用されるたびに、現在のシーケンス値がシステムテーブルに書き込まれます。 これにより、ディスクアクセスを増やすことでパフォーマンスが低下する可能性がありますが、意図しないギャップの可能性は減少します。 NEXT VALUE FOR関数またはsp_sequence_get_range関数を使用して数値が要求された場合でも、数値が使用されないか、コミットされていないトランザクションで使用され
シーケンスオブジェクトがCACHEオプションを使用する場合、シーケンスオブジェクトを再起動するか、INCREMENT、CYCLE、MINVALUE、MAXVALUE、またはcache sizeプロパティを変更すると、変更 その後、キャッシュは現在の値からリロードされます(つまり、数値はスキップされません)。 キャッシュサイズの変更はすぐに有効になります。
キャッシュオプションキャッシュされた値が使用可能な場合
シーケンスオブジェクトのインメモリキャッシュに使用可能な未使用の値がある場合、シーケンスオブジェクトがキャッシュオプションの次の値を生成するように要求されるたびに、次のプロセスが実行されます。シーケンスオブジェクトの次の値が計算されます。
-
シーケンスオブジェクトの次の値が計算されます。
-
シーケンスオブジェクトの新しい現在の値がメモリ内で更新されます。
-
計算された値が呼び出し元のステートメントに返されます。
キャッシュオプションキャッシュが使い果たされた場合
キャッシュが使い果たされた場合、シーケンスオブジェクトがキャッシュオプシ新しいキャッシュの最後の値が計算されます。
新しいキャッシュの最後の値が計算されます。
シーケンスオブジェクトのシステムテーブル行がロックされ、ステップ2で計算された値(最後の値)がシステムテーブルに書き込まれます。 キャッシュを使い果たしたxeventは、新しい永続化された値をユーザーに通知するために起動されます。
NO CACHE option
シーケンスオブジェクトがNO CACHEオプションの次の値を生成するように要求されるたびに、次のプロセスが発生します。
-
シーケンスオブシーケンスオブジェクトの新しい現在の値がシステムテーブルに書き込まれます。
-
シーケンスオブジェクトの新しい現在の値がシステ
-
計算された値が呼び出し元のステートメントに返されます。
メタデータ
シーケンスの詳細については、sysをクエリします。シーケンス。
セキュリティ
権限
スキーマに対するCREATE SEQUENCE、ALTER、またはCONTROL権限が必要です。
-
固定データベースロールdb_ownerおよびdb_ddladminのメンバーは、シーケンスオブジェクトを作成、変更、および削除できます。
-
db_ownerおよびdb_datawriter固定データベースロールのメンバーは、シーケンスオブジェクトに数値を生成させることで、シーケンスオブジェクトを更新できます。
次の例では、ユーザー AdventureWorks\Larryに、テストスキーマにシーケンスを作成する権限を付与します。
GRANT CREATE SEQUENCE ON SCHEMA::Test TO
シーケンスオブジェクトの所有権は、ALTER AUTHORIZATIONステートメントを使用して転送できます。
シーケンスがユーザー定義のデータ型を使用する場合、シーケンスの作成者はその型に対するREFERENCES権限を持っている必要があります。作成シーケンスを監査するには、SCHEMA_OBJECT_CHANGE_GROUPを監視します。
例
シーケンスを作成し、NEXT VALUE FOR関数を使用してシーケンス番号を生成する例については、シーケンス番号を参照してください。
次の例のほとんどは、testという名前のスキーマにシーケンスオブジェクトを作成します。
テストスキーマを作成するには、次のステートメントを実行します。
CREATE SCHEMA Test ; GO
A.1増加するシーケンスの作成
次の例では、Thierryは、使用するたびに1増加するCountby1という名前のシーケンスを作成します。
CREATE SEQUENCE Test.CountBy1 START WITH 1 INCREMENT BY 1 ; GO
B.1だけ減少するシーケンスを作成する
次の例は0から始まり、使用されるたびに負の数にカウントされます。p>
CREATE SEQUENCE Test.CountByNeg1 START WITH 0 INCREMENT BY -1 ; GO
C. 5増加するシーケンスの作成
次の例では、使用するたびに5増加するシーケンスを作成します。
CREATE SEQUENCE Test.CountBy1 START WITH 5 INCREMENT BY 5 ; GO
D.指定された番号で始まるシーケンスを作成する
テーブルをインポートした後、Thierryは使用される最も高いID番号が24,328であること Thierryには、24,329から始まる数を生成するシーケンスが必要です。 次のコードは、24,329で始まり、1ずつ増分するシーケンスを作成します。p>
CREATE SEQUENCE Test.ID_Seq START WITH 24329 INCREMENT BY 1 ; GO
E. 既定値を使用してシーケンスを作成する
次の例では、既定値を使用してシーケンスを作成します。
CREATE SEQUENCE Test.TestSequence ;
シーケンスのプロパティを表示するには、次のステートメントを実行します。
SELECT * FROM sys.sequences WHERE name = 'TestSequence' ;
出力の部分的なリストは、デフォルト値を示しています。
Output | Default value |
---|---|
start_value |
-9223372036854775808 |
increment |
1 |
mimimum_value |
-9223372036854775808 |
maximum_value |
9223372036854775807 |
is_cycling |
0 |
is_cached |
1 |
current_value |
-9223372036854775808 |
f.特定のデータ型を持つシーケンスの作成
次の例では、-32,768から32,767の範囲のsmallintデータ型を使用してシーケンスを作成します。
CREATE SEQUENCE SmallSeq AS smallint ;
g.すべての引数を使用してシーケンスを作成する
次の例では、0から255の範囲を持つdecimalデータ型を使用してDecSeqという名前のシーケンス シーケンスは125で始まり、数値が生成されるたびに25ずつ増加します。 シーケンスは、値が最大値200を超えたときに循環するように構成されているため、シーケンスは最小値100で再起動します。p>
CREATE SEQUENCE Test.DecSeq AS decimal(3,0) START WITH 125 INCREMENT BY 25 MINVALUE 100 MAXVALUE 200 CYCLE CACHE 3 ;
次のステートメントを実行して最初の値を確認します。START WITH
オプション125。p>
SELECT NEXT VALUE FOR Test.DecSeq;
ステートメントをさらに3回実行して、150、175、および200を返します。
ステートメントを再度実行して、開始値が100のMINVALUE
オプションにどのように戻るかを確認します。
次のコードを実行してキャッシュサイズを確認し、現在の値を確認します。
SELECT cache_size, current_value FROM sys.sequences WHERE name = 'DecSeq' ;
も参照してください
ALTER SEQUENCE(Transact-SQL)
DROP SEQUENCE(Transact-SQL)
NEXT VALUE FOR(Transact-SQL)
シーケンス番号