Yana Itzik Ben Gan makale 10 kodlanmış önbellek boyutunu yazılmıştır için IDENTITY
değiştirilmiş görünüyor. Gönderen bu bağlantı öğesi yapılan yorumlar
Ön tahsisatın boyutu, kimlik özelliğinin tanımlandığı sütunun veri türünün boyutuna dayanmaktadır. Bir SQL Server tamsayı sütunu için, sunucu kimlikleri 1000 değer aralığında önceden tahsis eder. Bigint veri tipi için, sunucu 10000 değer aralığında önceden tahsis eder.
T-SQL Sorgulama kitabı aşağıdaki tablo içeren ancak bu değerler belgelenmiş veya değişmemiş olması garanti olmadığını vurgular.
+-----------------+-----------+
| DataType | CacheSize |
+-----------------+-----------+
| TinyInt | 10 |
| SmallInt | 100 |
| Int | 1,000 |
| BigInt, Numeric | 10,000 |
+-----------------+-----------+
Buradaki makale çeşitli önbellek boyutlarını test eder ve parti boyutlarını ekler ve aşağıdaki sonuçları bulur.
Büyük kesici uçlar IDENTITY
için performans gösterdiği anlaşılıyor SEQUENCE
. Ancak, önbellek boyutunu 1.000 test etmez ve ayrıca bu sonuçlar sadece bir testtir. Çeşitli yığın boyutlarında uçlarla birlikte özellikle 1000 önbellek boyutuna baktığımda şu sonuçları aldım (her parti büyüklüğünü 50 kez denemek ve sonuçları her zaman μs altında olduğu gibi birleştirmek).
+------------+-----------+-----------+-----------+-----------+-----------+-----------+
| | 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 |
+------------+-----------+-----------+-----------+-----------+-----------+-----------+
Daha büyük parti boyutları için IDENTITY
sürüm genellikle daha hızlı görünür .
TSQL Sorgu kitabı ayrıca neden IDENTITY
sıralamaya göre performans avantajı sağlayabileceğini de açıklıyor .
IDENTITY
Masa özeldir ve SEQUENCE
değildir. Eğer felaket, log arabelleği temizlenmeden önce orta girişte grevde kalacaksa, kurtarma işlemi de insert'i geri alacağından, kurtarılan kimliğin daha erken olması önemli değildir, bu nedenle SQL Server günlük arabelleğini her kimliğe silmeye zorlamaz önbellekle ilgili disk yaz. Ancak Dizi için bu bir veritabanı dışında da dahil olmak üzere - değeri herhangi bir amaç için kullanılabilecek şekilde uygulanır. Yani yukarıdaki örnekte bir milyon eke ve 1000 önbellek büyüklüğüne sahip olan bu, bin günlük basamağa ek bir işlemdir.
Çoğaltılacak komut dosyası
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;