সিকোয়েন্স - কোন ক্যাচ বনাম ক্যাসিএ 1


25

এসকিউএল সার্ভার ২০১২+ তে কোনও 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

দুজনের মধ্যে কি কোনও পার্থক্য আছে? এসকিউএল সার্ভার 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 এর ক্যাশে এবং ক্যাশে আকারের জন্য পরীক্ষা করতে ব্যবহার করি used

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লক করা যখন একটি মান প্রয়োজন হয়। এবং যখন ক্যাশে নিঃশেষ হয়ে যায় এটি একটি IXএবং একটি Uলক দ্বারা অনুসরণ করা হয় এবং অবশেষে ইভেন্টটি metadata_persist_last_value_for_sequenceবরখাস্ত করা হয়।

সুতরাং এসকিউএল সার্ভারের একটি অপ্রত্যাশিত শাটডাউন করার ক্ষেত্রে সম্ভাব্যভাবে মানগুলি হারাতে চলেলে কোনও ক্যাশে এবং ক্যাশে 1 ব্যবহারের মধ্যে কোনও পার্থক্য থাকা উচিত।

ক্যাশে 1 সহ একটি সিকোয়েন্স তৈরি করার সময় অবশেষে আমি এসএসএমএসে বার্তা ট্যাবে কিছু লক্ষ্য করেছি।

সিক্যুয়েন্স অবজেক্ট 'dbo.S' এর জন্য ক্যাশে আকারটি কোনও ক্যাসে সেট করা হয়নি।

সুতরাং, এসকিউএল সার্ভার মনে করে যে কোনও পার্থক্য নেই এবং আমাকে তা বলে। sys.sequencesকলামের মধ্যে একটি পার্থক্য আছে cache_size। এটি কোনও ক্যাশে নেই এবং 1 এর ক্যাশের জন্য 1 টি নুল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.