sql >> Databáze >  >> RDS >> Sqlserver

Windows Azure SQL Database – sloupec automatického přírůstku identity přeskakuje hodnoty

Pokud potřebujete tyto mezery odstranit, můžete mít smůlu.

Sám jsem na tento problém narazil, když vyvíjím/testuji novou aplikaci. Na základě toho, co jsem četl o sql serveru 2012, intuitivně odhaduji, co se zde děje v sql azure. Nebyl jsem schopen najít žádnou dokumentaci o sql azure.

Z toho, co jsem četl, je to funkce, která se IMO jeví jako chyba. V SQL serveru 2012 Microsoft přidal možnost vytvářet sekvence. Sekvence zaznamenávají, jaké hodnoty byly použity v blocích po 1000. Řekněme tedy, že vaše sekvence postupovala... 1, 2, 3, 4, 5... a potom se váš server SQL restartuje. Sekvence již zachránila skutečnost, že bloky 1-1000 již byly použity, takže vás přeskočí na dalších 1000.... takže vaše další hodnota je 1001, 1002, 1003, 1004.... To zlepšuje výkon vloží při použití sekvencí, ale může to vést k neobvyklým mezerám. Pro vaši sekvenci existuje řešení. Při zadávání sekvence přidejte parametr "NOCACHE", aby neukládal bloky po 1000 najednou. Další dokumentaci naleznete zde.

Problémem je, že sloupce Identity byly podle všeho změněny tak, aby používaly stejné paradigma. Takže když se váš server nebo v tomto případě vaše instance SQL Azure restartuje, můžete získat velké mezery (1000) ve sloupcích vaší identity, protože ukládá velké bloky do mezipaměti jako „použité“. Pro SQL Server 2012 existuje řešení. Můžete zadat spouštěcí příznak t272, abyste svou identitu vrátili k použití starého paradigmatu SQL Server 2008 r2. Problém je v tom, že si nejsem vědom (možná to není možné), jak to zadat v sql Azure. Nelze najít dokumentaci. Zobrazit toto vlákno pro více podrobností o sql serveru 2012.

Zkontrolujte dokumentaci identity zde v msdn. Konkrétně sekce "Po sobě jdoucí hodnoty po restartu serveru nebo jiných poruchách". Zde je to, co říká:

Pokud tedy potřebujete mít po sobě jdoucí hodnoty, můžete zkusit zadat sekvenci pomocí nocache namísto spoléhání se na sloupec identity. Sám jsem to nezkoušel, ale vypadá to, že budete mít potíže s tím, aby to fungovalo s rámcem entit.

Omlouvám se, pokud to moc nepomůže, ale alespoň jsou to nějaké informace o tom, co prožíváte.



  1. Chyba poskytovatele pojmenovaných kanálů poskytovatele 40 nemohla otevřít připojení k chybě serveru SQL Server 2

  2. Arabský textový výstup problém s převodem php mysql utf-8

  3. Přístup ke vzdálené databázi mysql z příkazového řádku

  4. Proč se skript PHP nepodaří vložit do databáze MySQL?