যেহেতু ইটজিক বেন গণ নিবন্ধটি 10 এর হার্ডকোডযুক্ত ক্যাশে আকারে লেখা হয়েছিল IDENTITY
বলে মনে হয় এটি পরিবর্তন করা হয়েছে। এই সংযুক্ত আইটেমের মন্তব্যগুলি থেকে
প্রাক বরাদ্দকরণের আকারটি কলামের ডেটা ধরণের আকারের উপর ভিত্তি করে পরিচয় সম্পত্তিটি সংজ্ঞায়িত করা হয়। একটি এসকিউএল সার্ভার পূর্ণসংখ্যা কলামের জন্য, সার্ভারটি 1000 টির মানগুলির মধ্যে পূর্বনির্ধারিত পরিচয় দেয়। বিগিন্ট ডেটা টাইপ করার জন্য সার্ভারটি 10000 মানের ব্যাপ্তিতে প্রাক-বরাদ্দ করে।
টি-এসকিউএল অনুসন্ধান বই নিম্নলিখিত টেবিলে রয়েছে কিন্তু জোর দিয়েছেন যে এই মান নথিভুক্ত বা অপরিবর্তিত হতে নিশ্চিত করা হয় না।
+-----------------+-----------+
| DataType | CacheSize |
+-----------------+-----------+
| TinyInt | 10 |
| SmallInt | 100 |
| Int | 1,000 |
| BigInt, Numeric | 10,000 |
+-----------------+-----------+
এখানে নিবন্ধটি বিভিন্ন ক্রম ক্যাশে মাপ পরীক্ষা করে এবং ব্যাচের আকার সন্নিবেশ করে এবং নিম্নলিখিত ফলাফলগুলি নিয়ে আসে।
যা প্রদর্শিত বড় আকারের সন্নিবেশ IDENTITY
সম্পাদন করে বলে মনে হয় SEQUENCE
। এটি ক্যাশে আকারের 1000 পরীক্ষা করে না তবে ফলাফলগুলি কেবল একটি পরীক্ষা। বিভিন্ন ব্যাচের আকারের সন্নিবেশের সাহায্যে ক্যাশে আকার 1000-এ বিশেষভাবে তাকিয়ে আমি নিম্নলিখিত ফলাফল পেয়েছি (প্রতিটি ব্যাচের আকার 50 বার চেষ্টা করে ফলাফলগুলি নীচে হিসাবে একত্রিত করছি - সর্বকালে μs।)
+------------+-----------+-----------+-----------+-----------+-----------+-----------+
| | Sequence | Identity |
| Batch Size | Min | Max | Avg | Min | Max | Avg |
+------------+-----------+-----------+-----------+-----------+-----------+-----------+
| 10 | 2,994 | 7,004 | 4,002 | 3,001 | 7,005 | 4,022 |
| 100 | 3,997 | 5,005 | 4,218 | 4,001 | 5,010 | 4,238 |
| 1,000 | 6,001 | 19,013 | 7,221 | 5,982 | 8,006 | 6,709 |
| 10,000 | 26,999 | 33,022 | 28,645 | 24,015 | 34,022 | 26,114 |
| 100,000 | 189,126 | 293,340 | 205,968 | 165,109 | 234,156 | 173,391 |
| 1,000,000 | 2,208,952 | 2,344,689 | 2,269,297 | 2,058,377 | 2,191,465 | 2,098,552 |
+------------+-----------+-----------+-----------+-----------+-----------+-----------+
বৃহত্তর ব্যাচের আকারের জন্য IDENTITY
সংস্করণটি সাধারণত দ্রুত বলে মনে হয় ।
টিএসকিউএল ক্যোয়ারিং বইটিও ব্যাখ্যা করে যে IDENTITY
ক্রমগুলির চেয়ে পারফরম্যান্স সুবিধা কেন হতে পারে।
IDENTITY
টেবিল নির্দিষ্ট এবং SEQUENCE
নয়। লগ বাফারটি ফ্লাশ করার আগে যদি বিপর্যয় মাঝামাঝি strikeোকানো হত তবে পুনরুদ্ধার প্রক্রিয়াটি আগের সারণি হিসাবে পুনরুদ্ধার প্রক্রিয়াটিও সন্নিবেশটিকে পূর্বাবস্থায় ফেরাতে পারে তা বিবেচনা করে না, সুতরাং এসকিউএল সার্ভার প্রতিটি পরিচয়টিতে লগ বাফারটিকে ফ্লাশ করার জন্য জোর করে না ক্যাশে সম্পর্কিত ডিস্ক লিখুন। তবে সিকোয়েন্সের জন্য এটি প্রয়োগ করা হয়েছে কারণ মানটি কোনও উদ্দেশ্যেই ব্যবহার করা যেতে পারে - ডাটাবেসের বাইরেও। সুতরাং উপরের উদাহরণে এক মিলিয়ন সন্নিবেশ এবং 1,000 এর ক্যাশে আকার এটি একটি অতিরিক্ত হাজার লগ ফ্লাশ hes
পুনরুত্পাদন করার জন্য স্ক্রিপ্ট
DECLARE @Results TABLE(
BatchCounter INT,
NumRows INT,
SequenceTime BIGINT,
IdTime BIGINT);
DECLARE @NumRows INT = 10,
@BatchCounter INT;
WHILE @NumRows <= 1000000
BEGIN
SET @BatchCounter = 0;
WHILE @BatchCounter <= 50
BEGIN
--Do inserts using Sequence
DECLARE @SequenceTimeStart DATETIME2(7) = SYSUTCDATETIME();
INSERT INTO dbo.t1_Seq1_cache_1000
(c1)
SELECT N
FROM [dbo].[TallyTable] (@NumRows)
OPTION (RECOMPILE);
DECLARE @SequenceTimeEnd DATETIME2(7) = SYSUTCDATETIME();
--Do inserts using IDENTITY
DECLARE @IdTimeStart DATETIME2(7) = SYSUTCDATETIME();
INSERT INTO dbo.t1_identity
(c1)
SELECT N
FROM [dbo].[TallyTable] (@NumRows)
OPTION (RECOMPILE);
DECLARE @IdTimeEnd DATETIME2(7) = SYSUTCDATETIME();
INSERT INTO @Results
SELECT @BatchCounter,
@NumRows,
DATEDIFF(MICROSECOND, @SequenceTimeStart, @SequenceTimeEnd) AS SequenceTime,
DATEDIFF(MICROSECOND, @IdTimeStart, @IdTimeEnd) AS IdTime;
TRUNCATE TABLE dbo.t1_identity;
TRUNCATE TABLE dbo.t1_Seq1_cache_1000;
SET @BatchCounter +=1;
END
SET @NumRows *= 10;
END
SELECT NumRows,
MIN(SequenceTime) AS MinSequenceTime,
MAX(SequenceTime) AS MaxSequenceTime,
AVG(SequenceTime) AS AvgSequenceTime,
MIN(IdTime) AS MinIdentityTime,
MAX(IdTime) AS MaxIdentityTime,
AVG(IdTime) AS AvgIdentityTime
FROM @Results
GROUP BY NumRows;