실제로 차이를 찾을 때까지이 질문에 대한 명확한 대답을하기는 어렵습니다. 나는 아무것도 찾지 못했지만 그것이 내가 한 시험에서 하나도 보지 못했다는 차이점이 없다는 것을 의미하지는 않습니다.
쉬운 테스트는 성능을위한 것입니다. 루프에서 다음 값을 가져 오거나 숫자 테이블을 소스로 사용하여 한 번에 여러 값을 생성하십시오. 내 테스트에서 캐시를 사용하지 않는 것과 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
와 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입니다.