Sintomas
Assuma que adiciona uma coluna a uma tabela no Microsoft SQL Server 2012 ou SQL Server 2014. Quando o tamanho da linha estiver próximo do tamanho máximo permitido que seja de 8.060 bytes, a operação de adição pode demorar muito tempo.
Causa
O problema ocorre porque, quando o tamanho total da linha está próximo do tamanho máximo permitido da linha, o SQL Server faz uma varredura completa da tabela para garantir que adicionar uma nova coluna não viola a integridade dos dados. As versões antes do SQL Server 2012 não fazem esta verificação, e isso faz com que o idioma de definição de dados (DDL) seja executado mais rapidamente. No entanto, este comportamento resulta na falha de operações subsequentes, tais como atualização de linha ou redução se o tamanho da linha exceder o tamanho permitido.
Resolução
A atualização cumulativa introduz uma nova bandeira de traço 647 para o comportamento de retrocompatibilidade. O problema foi corrigido pela primeira vez na seguinte atualização cumulativa do SQL Server.
Atualização Cumulativa 5 para SQL Server 2014 /en-us/help/3011055
Atualização Cumulativa 12 para SQL Server 2012 SP1 /en-us/help/2991533
Atualização Cumulativa 2 para SQL Server 2012 SP2 /en-us/help/2983175
Cada nova atualização cumulativa do SQL Server contém todos os hotfixes e todas as correções de segurança que foram incluídas com a atualização cumulativa anterior. Confira as últimas atualizações cumulativas do SQL Server:
Mais Informações
-
Pode ligar a bandeira de traço 647 utilizando o parâmetro de arranque. Para obter informações, consulte opções de arranque do serviço de motores de base de dados.
-
Pode executar a seguinte consulta (Substitua <nome de mesa> com a sua nome de mesa real) para testar a tabela em particular antes da operação num sistema de produção e planeie o efeito desta emissão. Se o resultado for superior a 8.060, a sua mesa está sujeita a esta questão. Além disso, se deixou cair colunas, tem de alterar a tabela com a opção de reconstrução. A reconstrução da tabela pode fazer com que a consulta devolva os resultados corretos.
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
-
Pode considerar a possibilidade de adicionar colunas de comprimento variável ou colunas escassas quando a sua aplicação frequentemente adiciona novas colunas à tabela. É uma operação só de metadados, mesmo que o tamanho total de todas as colunas exceda 8.060 bytes.
Estado
A Microsoft confirmou que este problema ocorre nos produtos da Microsoft listados na secção "Aplica-se a".