Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Увеличението на идентичността скача в базата данни на SQL Server

Срещате това поведение поради подобрение на производителността след SQL Server 2012.

Сега по подразбиране използва размер на кеша от 1000, когато разпределя IDENTITY стойности за int колона и рестартирането на услугата може да "загуби" неизползвани стойности (Размерът на кеша е 10 000 за bigint /numeric ).

Това е посочено в документацията

SQL Server може да кешира стойностите на самоличността от съображения за производителност и някои от присвоените стойности могат да бъдат загубени по време на повреда на базата данни или рестартиране на сървъра. Това може да доведе до пропуски в стойността на идентичността при вмъкване. Ако пропуските не са приемливи, приложението трябва да използва свой собствен механизъм за генериране на ключови стойности. Използване на генератор на последователности с NOCACHE опцията може да ограничи пропуските до транзакции, които никога не са ангажирани.

От данните, които сте показали, изглежда, че това се е случило след въвеждането на данни за 22 декември, а след това, когато се рестартира, SQL Server запази стойностите 1206306 - 1207305 . След въвеждане на данни за 24 - 25 декември беше направено ново рестартиране и SQL Server запази следващия диапазон 1207306 - 1208305 видимо в записите за 28.

Освен ако не рестартирате услугата с необичайна честота, е малко вероятно всички „загубени“ стойности да направят значителна вдлъбнатина в диапазона от стойности, разрешени от типа данни, така че най-добрата политика е да не се притеснявате за това.

Ако това по някаква причина е реален проблем за вас, някои възможни решения са...

  1. Можете да използвате SEQUENCE вместо колона за идентичност и дефинирайте например по-малък размер на кеша и използвайте NEXT VALUE FOR в колона по подразбиране.
  2. Или приложете флаг за проследяване 272, който прави IDENTITY разпределението се регистрира както във версии до 2008 R2. Това се отнася глобално за всички бази данни.
  3. Или за последните версии изпълнете ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF за да деактивирате кеширането на самоличността за конкретна база данни.

Трябва да сте наясно, че никое от тези заобиколни решения не гарантира липса на пропуски. Това никога не е било гарантирано от IDENTITY тъй като това би било възможно само чрез сериализиране на вмъквания към таблицата. Ако имате нужда от колона без празнини, ще трябва да използвате различно решение от IDENTITY или SEQUENCE



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как работи операторът IF в SQL Server

  2. Как да увеличите допустимия размер на прикачените файлове при изпращане на имейл в SQL Server (T-SQL)

  3. Какво е значението на префикса N в T-SQL изразите и кога трябва да го използвам?

  4. Изчисляване на броя на пълните месеци между две дати в SQL

  5. TDS сървър - Използвайте Transact-SQL (T-SQL) изявления за работа с данни на Salesforce в SQL Server