ลำดับ - ไม่มีแคชเทียบกับ CACHE 1


25

มีความแตกต่างระหว่างการSEQUENCEประกาศใช้NO CACHEและประกาศใช้CACHE 1ใน SQL Server 2012+?

ลำดับ # 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_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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.