Eu tenho uma tabela com milhões de linhas e uma coluna que permite valores nulos. No entanto, nenhuma linha atualmente possui um valor NULL para essa coluna (posso verificar isso rapidamente com uma consulta). No entanto, quando executo o comando
ALTER TABLE MyTable ALTER COLUMN MyColumn BIGINT NOT NULL;
a consulta leva uma eternidade relativamente falando. Na verdade, leva entre 10 e 20 minutos, mais do que o dobro da adição de uma restrição de verificação. Existe uma maneira de atualizar instantaneamente os metadados da tabela para essa coluna, principalmente porque eu sei que nenhuma linha tem um valor NULL para essa coluna?
sql-server-2008
null
alter-table
Joseph Daigle
fonte
fonte
Sch-M
bloqueio quando "durar para sempre". Você olhou para ver se estava esperando ou ocupado?Respostas:
A resposta do @ ypercube gerencia isso parcialmente, pois apenas os metadados são alterados.
Adicionar a restrição
NOCHECK
significa que nenhuma linha precisará ser lida para verificá-la e, se você estiver começando em uma posição em que a coluna não contémNULL
valores (e se você souber que nenhuma será adicionada entre verificar e adicionar a restrição), como a restrição impede aNULL
criação de valores do futuroINSERT
ou dasUPDATE
operações, isso funcionará.A adição da restrição ainda pode ter impacto nas transações simultâneas. A
ALTER TABLE
necessidade de adquirir umSch-M
bloqueio primeiro. Enquanto aguarda, todos os outros acessos à tabela serão bloqueados conforme descrito aqui .Uma vez que o
Sch-M
bloqueio é adquirido, a operação deve ser bastante rápida.Um problema com isso é que, mesmo que você saiba que a coluna não possui,
NULL
a restrição não é confiável pelo otimizador de consultas, o que significa que os planos podem ficar abaixo do ideal.Compare isso com o mais simples
Um possível problema que você pode encontrar ao alterar a definição da coluna dessa maneira é que ela não apenas precisa ler todas as linhas para verificar se elas atendem à condição, mas também pode acabar realmente executando atualizações registradas nas linhas .
Uma casa possível a meio caminho pode ser adicionar a restrição de verificação
WITH CHECK
. Isso será mais lento doWITH NOCHECK
que o necessário para ler todas as linhas, mas permite que o otimizador de consultas forneça o plano mais simples na consulta acima e evite o possível problema de atualizações registradas.fonte
Você pode, em vez de alterar a coluna, adicionar uma
CHECK
restrição de tabela com aNOCHECK
opção:fonte
NULL
mas não poderiam ser usadas pelo otimizador de consultas.ALTER COLUMN
que quando aSch-M
trava é adquirida, isso não precisa varrer as linhas). Apenas indicando que não é bem a mesma coisa (por exemplo, se usado em umaNOT IN
consulta o plano será mais complexo)