Příznaky
Předpokládejme, že jste do tabulky přidali sloupec v Microsoft SQL serveru 2012 nebo SQL Server 2014. Když je velikost řádku blízko maximální povolené velikosti 8 060 bajtů, může operace přidání trvat dlouho.
Příčina
K tomuto problému dochází, protože pokud je celková velikost řádku blízko maximální povolené velikosti řádku, provede SQL Server úplnou kontrolu tabulky, aby se ujistil, že přidání nového sloupce neruší integritu dat. Verze před serverem SQL Server 2012 tuto kontrolu nedělají a že jazyk DDL (Data Definition Language) běží rychleji. Výsledkem tohoto chování však je selhání následujících operací, jako je aktualizace řádku nebo zmenšení, pokud velikost řádku přesáhne povolenou velikost.
Řešení
Kumulativní aktualizace zavádí nový příznak trasování 647 z důvodu zpětné kompatibility. Tento problém byl poprvé opraven následující kumulativní aktualizací SQL serveru.
Kumulativní aktualizace 5 pro SQL Server 2014 /en-us/help/3011055
Kumulativní aktualizace 12 pro SQL Server 2012 SP1 /en-us/help/2991533
Kumulativní aktualizace 2 pro SQL Server 2012 SP2 /en-us/help/2983175
Každá nová kumulativní aktualizace pro SQL Server obsahuje všechny opravy hotfix a všechny opravy zabezpečení, které byly součástí předchozí kumulativní aktualizace. Podívejte se na nejnovější kumulativní aktualizace SQL serveru:
Další informace
-
Příznak Trace 647 můžete zapnout pomocí parametru Startup (spuštění). Informace najdete v tématu Možnosti spuštění služby databázový stroj.
-
Můžete spustit následující dotaz (nahraďte <název tabulky> skutečným názvem tabulky), abyste otestovali určitou tabulku před operací ve výrobním systému a naplánujete účinek tohoto problému. Pokud je výsledek větší než 8 060, bude tabulka podléhat tomuto problému. Pokud jste sloupec zanechali, musíte změnit tabulku pomocí možnosti nového sestavení. Při opětovném vytvoření tabulky může dotaz vrátit správné výsledky.
select 1+1+2 + 2 + (case when sum (case when leaf_offset < 0 then 1 else 0 end) > 0 then 2 else 0 end) + ( (count (*) + 7)/8 ) + count (case when leaf_offset < 0 then 1 else null end) * 2 + sum( case when max_length=-1 then 24 else max_length end) from sys.system_internals_partition_columns col join sys.partitions par on col.partition_id = par.partition_id where object_id = object_id ('<table name>') and index_id in (0,1) and partition_number =1
-
Když aplikace často přidá do tabulky nové sloupce, můžete přidat sloupce variabilní délky nebo zhuštěné sloupce. Jedná se o operaci s metadaty, i když celková velikost všech sloupců přesahuje 8 060 bajtů.
Stav
Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti, které jsou uvedeny v části Informace v tomto článku jsou určeny pro produkt.