To není chyba... to je vlastnost!

Už léta si spousta lidí dělá z Microsoftu legraci, že pokud se u Windows objeví bug, pak Microsoft, místo aby chybu opravil, prohlásí, že to byl záměr a je to tedy vlastnost. Člověk se tomu rád zasměje a událost zařadí do kolonky “IT humor”. To funguje do té doby než na takovou chybu sami narazíte.

Microsoft SQL Server 2012 je solidním nástupcem pro Microsoft SQL Server 2008. Po aktualizaci na sebe dlouho nenechal čekat bug, který spíš než k dlouhému odhalování vedl k němému úžasu.

Pokud se použije integer (int) jako ID v tabulce, pak z výkonnostních důvodů, si server zabere ID + 1000. Takže máte ID např. 1, 2, 3, 4, 5 – pak dojde k restartu, výpadku nebo přerušení a místo aby server pokračoval v řadě následujícími čísly 6, 7, 8 atd., tak jako doposud, číslování poskočí o 1000, takže začne 1006, 1007, 1008 atd. U Microsoft SQL Server 2012 je to nová vlastnost!

Vysvětlení je jednoduché. Server si alokuje (dá do cache)následujích 1000 čísel. Pro bigint si alokuje 10000. Pokud byl od restartu do tabulky vložen alespoň 1 záznam, pak má pro danou tabulku alokovanou řadu čísel pro ID.

ID čísla nemají žádný význam, proto by to nijak nemělo vadit. Ale osobně mi vadí, pokud je řada přerušená jenom kvůli tomu, že se server např. zrestartoval. Přijde mi to jako dost nešťastné řešení, které vede jenom k tomu, že řada ID čísel bude nekonzistentní.

Možností je několik:

1) Nechat to být a spokojit se s tím, že je server o něco výkonnější…

2) Použít NO CACHE

3) Použít uloženou proceduru po startu serveru, která překontroluje ID (DBCC CHECKIDENT)

Podrobnosti s návodem lze nalézt na [EN] fóru, SO a na Microsoft Connect.