A Comparação de Esquema SSDT não funciona enquanto uma INSERÇÃO EM GRANEL está em andamento

11

Estou trabalhando em um grande projeto ETL e DW, onde usamos o controle de fonte / TFS junto com o SSIS e o SSDT.

Hoje, descobri que, enquanto um pacote SSIS está executando um BULK INSERT em uma tabela de banco de dados, não é possível executar uma comparação de esquema SSDT nesse banco de dados. Isso é lamentável, pois alguns de nossos pacotes levam muito tempo para serem concluídos. Queremos usar a função Comparar esquema para detectar alterações na estrutura do banco de dados, a fim de salvá-las em nosso projeto SSDT para controle de versão do banco de dados.

Examinando um pouco mais isso, descobri que a função Comparação de Esquema no SSDT executa um script SQL que chama a OBJECTPROPERTY()função do sistema nas tabelas no banco de dados. Especificamente no meu caso, qualquer chamada para OBJECTPROPERTY(<object_id>, N'IsEncrypted')parece bloqueada, quando <object_id>se refere a uma tabela que está sendo inserida em massa no momento.

No Visual Studio, o SSDT Schema Compare simplesmente excede o tempo limite e alega que nenhuma diferença foi detectada.

Existe uma solução alternativa para esse problema no SSDT ou devo tentar arquivar um relatório de bug do MS Connect?

Como alternativa, como o BULK INSERT ocorre a partir de um pacote SSIS, existe alguma maneira de fazer essa inserção sem bloquear as OBJECTPROPERTYchamadas na tabela? Edit: Nos destinos SSIS OLE DB, podemos remover a marca de seleção de "Lock Table", que faz o que diz, mas isso pode prejudicar o desempenho em algumas situações. Estou muito mais interessado em uma solução que permita que o SSDT Schema Compare faça seu trabalho, mesmo que alguns objetos estejam bloqueados.

Dan
fonte
Consulte Controlando o comportamento de bloqueio para importação em massa - você pode ter o 'bloqueio de tabela no carregamento em massa' ativado. Também verifique o seu BULK INSERT não está especificando TABLOCK
stuartd
Se você estiver usando bloqueios de tabela, poderá encontrar a carga mais rapidamente se desativá-la de qualquer maneira ( technet.microsoft.com/en-us/library/ms177445.aspx ) - qualquer que seja a causa que eu levaria à conexão, porque um tempo limite deveria muito menos deixar em vez de apenas dizer que não há mudanças
Ed Elliott
Obrigado pelas respostas, stuartd e Ed Elliot. Acontece que realmente queremos bloquear a mesa, por razões de desempenho. Na minha opinião, o SSDT deve ser capaz de lidar com isso, porque queremos apenas comparar o banco de dados, não aplicar alterações aos objetos no banco de dados. Vou criar uma postagem de conexão para resolver isso.
Dan
3
Os internos não são o meu forte, mas, pelo que entendi, você tem um cadeado na mesa. Qualquer que seja o bloqueio realizado, a inserção em massa é incompatível com os bloqueios necessários para validar o esquema. Leitura relevante BOL Schema lock
billinkc
Talvez você possa explicar melhor por que a comparação de esquema deve ser executada em paralelo com uma operação de carregamento? Talvez uma alternativa seja ter um modelo de referência do banco de dados. Sem dados, apenas esquema. Execute suas comparações com isso e garanta que ninguém modifique o banco de dados real em que essas operações em massa estão sendo executadas sem primeiro atualizar o modelo de referência.
billinkc

Respostas:

19

A OBJECTPROPERTYchamada requer um bloqueio de estabilidade do esquema (Sch-S), que é incompatível apenas com um bloqueio de modificação de esquema (Sch-M).

O BULK INSERTbloqueio de Sch-M será necessário em algumas circunstâncias. Eles estão listados na seção "Bloqueio e registro de tabela durante a importação em massa" das Diretrizes para otimizar a importação em massa nos Manuais Online:

Bloqueio de importação em massa

Se a tabela de destino estiver em cluster, você poderá encontrar ajuda na ativação do sinalizador de rastreamento 610 . Leia toda a série dessas postagens e o Guia de desempenho para carregamento de dados e faça um teste completo se você decidir seguir esse caminho.

Não faço ideia por que o SSDT verifica a IsEncryptedpropriedade em busca de tabelas. Não consigo imaginar um cenário em que isso faça sentido, mas essa é uma pergunta para o pessoal do SSDT.

Paul White 9
fonte
3
Essa foi uma resposta muito abrangente e satisfatória. Muito obrigado.
Dan