순서-NO CACHE vs CACHE 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

둘 사이에 어떤 차이가 있습니까? SQL Server 2012+ 환경에서 사용될 때 다르게 동작합니까?

답변:


24

실제로 차이를 찾을 때까지이 질문에 대한 명확한 대답을하기는 어렵습니다. 나는 아무것도 찾지 못했지만 그것이 내가 한 시험에서 하나도 보지 못했다는 차이점이 없다는 것을 의미하지는 않습니다.

쉬운 테스트는 성능을위한 것입니다. 루프에서 다음 값을 가져 오거나 숫자 테이블을 소스로 사용하여 한 번에 여러 값을 생성하십시오. 내 테스트에서 캐시를 사용하지 않는 것과 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_sequencesqlserver.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 IXU자물쇠 가 뒤 따르고 결국 이벤트 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.