যতক্ষণ না আপনি বাস্তবে কোনও পার্থক্য খুঁজে পান ততক্ষণ এই প্রশ্নের একটি নির্দিষ্ট উত্তর দেওয়া শক্ত। আমি কিছুই পাইনি তবে এর অর্থ এই নয় যে কেবলমাত্র আমি যে পরীক্ষাগুলি নিয়েছি সেগুলিতে আমি কোনটিই দেখিনি।
পারফরম্যান্সের জন্য সহজ পরীক্ষা। হয় লুপে পরবর্তী মান পাওয়া বা একসাথে একাধিক মান উত্পন্ন করার জন্য উত্স হিসাবে একটি সংখ্যা সারণী ব্যবহার করা। আমার পরীক্ষাগুলিতে কোনও ক্যাশে এবং 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 টি নুল।