KB2986423 – OPRAVA: Keď veľkosť riadka presiahne maximálnu povolenú veľkosť, pridávanie nových stĺpcov do tabuľky trvá príliš dlho

Vzťahuje sa na
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard

Príznaky

Predpokladajme, že pridáte stĺpec do tabuľky v Microsoft SQL Server 2012 alebo SQL Server 2014. Keď sa veľkosť riadka blíži maximálnej povolenej veľkosti 8 060 bajtov, operácia pridávania môže trvať pomerne dlho.

Príčina

Problém sa vyskytuje, pretože keď sa celková veľkosť riadka blíži maximálnej povolenej veľkosti riadka, SQL Server vykoná úplnú kontrolu tabuľky, aby sa zabezpečilo, že pridanie nového stĺpca nenaruší integritu údajov. Verzie staršie ako SQL Server 2012 túto kontrolu nevykonávajú, čím sa zrýchli jazyk DDL (Data Definition Language). Ak však veľkosť riadka prekročí povolenú veľkosť, toto správanie má za následok zlyhanie následných operácií, ako je napríklad aktualizácia alebo zmenšenie riadka.

Riešenie

Kumulatívna aktualizácia zavádza nový príznak sledovania 647 pre správanie spätnej kompatibility.
Tento problém bol prvýkrát opravený v nasledujúcej kumulatívnej aktualizácii SQL Server.

Kumulatívna aktualizácia 5 pre SQL Server 2014 /en-us/help/3011055

Kumulatívna aktualizácia 12 pre SQL Server 2012 SP1 /en-us/help/2991533

Kumulatívna aktualizácia 2 pre SQL Server 2012 SP2 /en-us/help/2983175

Informácie o kumulatívnych aktualizáciách pre SQL Server

Každá nová kumulatívna aktualizácia pre SQL Server obsahuje všetky rýchle opravy a opravy zabezpečenia, ktoré boli zahrnuté v predchádzajúcej kumulatívnej aktualizácii. Pozrite si najnovšie kumulatívne aktualizácie pre SQL Server:

      

Ďalšie informácie

  • Pomocou parametra spúšťania môžete zapnúť príznak sledovania 647. Ďalšie informácie nájdete v téme Možnosti spustenia služby databázového stroja.

  • Môžete spustiť nasledujúci dotaz (Nahraďte <názov> tabuľky skutočným názvom tabuľky) a otestovať konkrétnu tabuľku pred operáciou v produkčnom systéme a naplánovať vplyv tohto problému. Ak je výsledok väčší ako 8 060, problém sa týka tohto problému s tabuľkou. Ak ste navyše vynechali stĺpce, musíte tabuľku zmeniť pomocou možnosti Znova zostaviť. Po opätovnom zostavení tabuľky môže dotaz vrátiť správne 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 
    
  • Ak vaša aplikácia často pridáva nové stĺpce do tabuľky, môžete zvážiť pridanie stĺpcov s premenlivou dĺžkou alebo riedke stĺpce. Ide o operáciu iba s metaúdajmi, a to aj v prípade, že celková veľkosť všetkých stĺpcov presahuje 8 060 bajtov.

      

Stav

Spoločnosť Microsoft potvrdila, že ide o problém v produktoch spoločnosti Microsoft, ktoré sú uvedené v časti Vzťahuje sa na.