Eu criei um script que, um de cada vez, exclui todas as chaves estrangeiras de um banco de dados, assim:
ALTER TABLE MyTable1 DROP CONSTRAINT FK_MyTable1_col1
ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col1
ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col2
O que me surpreende é que o script leva muito tempo: em média, 20 segundos para cada DROP FK. Agora, eu entendo que criar um FK pode ser um grande problema, porque o servidor precisa verificar se a restrição do FK não foi violada desde o início, mas caiu? O que um servidor faz ao eliminar FKs que demoram tanto tempo? Isso é tanto para minha própria curiosidade quanto para entender se existe uma maneira de tornar as coisas mais rápidas. Ser capaz de remover o FK (não apenas desativá-los) me permitiria ser muito mais rápido durante uma migração e, portanto, minimizar o tempo de inatividade.
sql-server
foreign-key
sql-server-2016
carlo.borreo
fonte
fonte
Respostas:
A eliminação de uma restrição requer um bloqueio Sch-M (modificação do esquema) que bloqueia outras pessoas para consultar a tabela durante a modificação. Você provavelmente está aguardando para obter esse bloqueio e deve aguardar até que todas as consultas atualmente em execução nessa tabela sejam concluídas.
Uma consulta em execução possui um bloqueio Sch-S (Schema Stability) na tabela e esse bloqueio é incompatível com um bloqueio Sch-M.
Dos modos de bloqueio, bloqueios de esquema
fonte
Sch-S
bloqueio, e eu suspeito que essa seja a causa raiz dos problemas do OP.Vou orientá-lo através de um exemplo para que você possa ver por que estava demorando muito tempo. Criando um banco de dados vazio para este teste.
Criando 2 tabelas.
Criando uma restrição de Chave Estrangeira na tabela Pessoa.
Insira alguns dados nas duas tabelas.
Abra uma nova janela de consulta e execute-a (não feche a janela depois que a consulta for concluída).
Abra outra janela de consulta e execute isso.
Você verá que a restrição de queda continuará em execução (aguardando) e agora execute a consulta para ver por que está demorando mais e quais bloqueios está aguardando.
Depois de confirmar sua operação de inserção, a restrição de descarte será concluída imediatamente, porque agora a instrução de descarte pode adquirir o bloqueio necessário.
Para o seu caso, você precisa garantir que nenhuma sessão esteja mantendo um bloqueio compatível, o que impedirá a restrição de queda para adquirir os bloqueios / bloqueios necessários.
fonte