มันยากที่จะให้คำตอบที่ชัดเจนในคำถามนี้จนกว่าคุณจะพบความแตกต่าง ฉันไม่พบ แต่ไม่ได้หมายความว่าไม่มีความแตกต่างเพียงอย่างเดียวที่ฉันไม่เคยเห็นในการทดสอบที่ฉันทำ
การทดสอบง่าย ๆ สำหรับประสิทธิภาพ รับค่าถัดไปในลูปหรือใช้ตารางตัวเลขเป็นแหล่งข้อมูลเพื่อสร้างค่าหลายค่าในแต่ละครั้ง ในการทดสอบของฉันไม่มีความแตกต่างของประสิทธิภาพระหว่างการใช้ไม่มีแคชและแคชของ 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
ก็ถูกไล่ออก
ดังนั้นจึงไม่มีความแตกต่างระหว่างการใช้ไม่มีแคชและแคช 1 เมื่อมันมาถึงการสูญเสียค่าในการปิด SQL Server ที่ไม่คาดคิด
ในที่สุดฉันก็สังเกตเห็นบางสิ่งในแท็บข้อความใน SSMS เมื่อสร้างลำดับด้วยแคช 1
ขนาดแคชสำหรับวัตถุลำดับ 'dbo.S' ถูกตั้งค่าเป็น NO CACHE
ดังนั้น SQL Server คิดว่าไม่มีความแตกต่างและบอกฉันอย่างนั้น มี แต่ความแตกต่างในในคอลัมน์sys.sequences
cache_size
เป็น NULL ที่ไม่มีแคชและ 1 สำหรับแคชที่ 1