चूंकि इट्ज़िक बेन गान लेख को 10 के हार्डकॉश कैश आकार में लिखा गया था, IDENTITY
ऐसा लगता है कि इसे बदल दिया गया है। इस कनेक्ट आइटम पर टिप्पणियों से
पूर्व-आवंटन का आकार स्तंभ के डेटा प्रकार के आकार पर आधारित होता है, जिस पर पहचान गुण परिभाषित होता है। SQL सर्वर पूर्णांक स्तंभ के लिए, सर्वर 1000 मानों की श्रेणी में पहचान आवंटित करता है। बिगिन्ट डेटा के लिए सर्वर 10000 मानों की श्रेणी में पूर्व-आबंटित होता है।
T-SQL क्वैरी पुस्तक निम्न तालिका में शामिल है, लेकिन जोर देती है कि इन मूल्यों को दस्तावेज या अपरिवर्तित होने की गारंटी नहीं कर रहे हैं।
+-----------------+-----------+
| DataType | CacheSize |
+-----------------+-----------+
| TinyInt | 10 |
| SmallInt | 100 |
| Int | 1,000 |
| BigInt, Numeric | 10,000 |
+-----------------+-----------+
यहां लेख विभिन्न अनुक्रम कैश आकारों का परीक्षण करता है और बैच आकार सम्मिलित करता है और निम्नलिखित परिणामों के साथ आता है।
जो यह दर्शाता है कि बड़े आवेषण के IDENTITY
लिए प्रदर्शन करता है SEQUENCE
। हालांकि यह कैश आकार 1,000 का परीक्षण नहीं करता है और यह भी कि परिणाम केवल एक परीक्षण है। आवेषण के विभिन्न बैच आकारों के साथ विशेष रूप से कैश आकार 1,000 को देखते हुए मुझे निम्नलिखित परिणाम मिले (प्रत्येक बैच के आकार को 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
संस्करण आम तौर पर तेज लगता है ।
TSQL क्वेरी पुस्तक यह भी बताती है कि IDENTITY
अनुक्रम पर प्रदर्शन लाभ क्यों हो सकता है।
IDENTITY
तालिका विशिष्ट है और SEQUENCE
नहीं है। यदि लॉग बफ़र से पहले मध्य डालने पर आपदा आनी थी, तो पुनर्प्राप्त की गई पहचान से कोई फर्क नहीं पड़ता, यदि पुनर्प्राप्ति प्रक्रिया पहले वाली हो तो भी सम्मिलित हो जाएगी, इसलिए SQL सर्वर हर पहचान पर लॉग बफ़र को फ्लश करने के लिए बाध्य नहीं करता है कैश संबंधित डिस्क लेखन हालांकि अनुक्रम के लिए इसे लागू किया जाता है क्योंकि मूल्य किसी भी उद्देश्य के लिए उपयोग किया जा सकता है - डेटाबेस के बाहर भी। तो ऊपर के उदाहरण में एक लाख आवेषण और 1,000 के कैश आकार के साथ यह एक अतिरिक्त हजार लॉग फ्लश है।
पुन: पेश करने के लिए स्क्रिप्ट
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;