シーケンス-キャッシュなしvsキャッシュ1


25

SQL Server 2012+で宣言さSEQUENCEれた使用NO CACHEと宣言された使用の間に違いはありCACHE 1ますか?

シーケンス#1:

CREATE SEQUENCE dbo.MySeqCache1
AS INT
    START WITH 1
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 9999
    NO CYCLE
    CACHE 1;
GO

シーケンス#2:

CREATE SEQUENCE dbo.MySeqNoCache
AS INT
    START WITH 1
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 9999
    NO CYCLE
    NO CACHE;
GO

2つの間に違いはありますか?SQL Server 2012+環境で使用される場合、それらは異なる動作をしますか?

回答:


24

実際に違いを見つけるまで、この質問について明確な答えを出すことは困難です。私は何も発見しませんでしたが、それは私が行ったテストで1つを見なかったことだけに違いがないという意味ではありません。

簡単なテストはパフォーマンスです。ループ内で次の値を取得するか、ソースとして数値テーブルを使用して、一度に複数の値を生成します。私のテストでは、キャッシュなしと値1のキャッシュを使用してもパフォーマンスに違いはありませんでしたが、キャッシュ2を使用するとパフォーマンスが大幅に向上しました。

これは、パフォーマンスのテストに使用したコードです。

declare @D datetime = getdate();

declare @I int = 0;
while @I < 9999
  select @I = next value for dbo.S;

select datediff(millisecond, @D, getdate());

結果:

Cache        Time(ms)
------------ --------
NO CACHE     1200
1            1200
2             600
1000           70  

少し深く掘るために私は、拡張イベントを使用sqlserver.metadata_persist_last_value_for_sequenceし、sqlserver.lock_acquiredどのような値を持続するシステムテーブルへの異なる何かがあったかどうかを確認します。

このコードを使用して、キャッシュなしおよび1と4のキャッシュサイズをテストしました。

DECLARE @S NVARCHAR(max) = '
CREATE EVENT SESSION SeqCache ON SERVER 
ADD EVENT sqlserver.lock_acquired(
    WHERE (sqlserver.session_id=({SESSIONID}))),
ADD EVENT sqlserver.metadata_persist_last_value_for_sequence(
    WHERE (sqlserver.session_id=({SESSIONID}))) 
ADD TARGET package0.event_file(SET filename=N''d:\SeqCache'');';

SET @S = REPLACE(@S, '{SESSIONID}', CAST(@@SPID AS NVARCHAR(max)));

EXEC (@S);

GO

CREATE SEQUENCE dbo.S
AS INT
    START WITH 1
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 9999
    NO CYCLE
    NO CACHE;
--    CACHE 1;
--    CACHE 4;

GO

ALTER EVENT SESSION SeqCache ON SERVER STATE = START;

GO

DECLARE @I INT = 0;
WHILE @I < 10
  SELECT @I = NEXT VALUE FOR dbo.S;

GO

ALTER EVENT SESSION SeqCache ON SERVER STATE = STOP;
DROP EVENT SESSION SeqCache ON SERVER;
DROP SEQUENCE dbo.S;

キャッシュなしとキャッシュ1を使用した場合の出力に違いはありません。

サンプル出力:

name                                      persisted_value mode
----------------------------------------- --------------- -----
lock_acquired                             NULL            SCH_S
lock_acquired                             NULL            IX
lock_acquired                             NULL            U
metadata_persist_last_value_for_sequence  1               NULL
lock_acquired                             NULL            SCH_S
lock_acquired                             NULL            IX
lock_acquired                             NULL            U
metadata_persist_last_value_for_sequence  2               NULL
lock_acquired                             NULL            SCH_S
lock_acquired                             NULL            IX
lock_acquired                             NULL            U
metadata_persist_last_value_for_sequence  3               NULL

4のキャッシュを使用する場合。

name                                      persisted_value mode
----------------------------------------- --------------- -----
lock_acquired                             NULL            SCH_S
lock_acquired                             NULL            IX
lock_acquired                             NULL            U
metadata_persist_last_value_for_sequence  4               NULL
lock_acquired                             NULL            SCH_S
lock_acquired                             NULL            SCH_S
lock_acquired                             NULL            SCH_S
lock_acquired                             NULL            SCH_S
lock_acquired                             NULL            IX
lock_acquired                             NULL            U
metadata_persist_last_value_for_sequence  8               NULL

SCH_S値が必要なときにロックが行われます。そして、キャッシュが使い果たされると、a IXとa Uロックが続き、最後にイベントmetadata_persist_last_value_for_sequenceが発生します。

したがって、SQL Serverの予期しないシャットダウンで値を失う可能性がある場合、キャッシュを使用しない場合とキャッシュ1を使用する場合に違いはありません。

最後に、キャッシュ1でシーケンスを作成するときに、SSMSの[メッセージ]タブで何かに気付きました。

シーケンスオブジェクト「dbo.S」のキャッシュサイズはNO CACHEに設定されています。

そのため、SQL Serverは違いはないと考えており、そう教えてくれます。ただしsys.sequences、列には違いがありますcache_size。キャッシュがない場合はNULL、キャッシュが1の場合は1です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.