Tenho o SQL Server 2016. Tenho duas tabelas com a mesma estrutura, uma contém dados históricos e a outra contém dados atuais.
Eu tenho uma visão que os programas usam, que retorna o conteúdo das duas tabelas.
CREATE TABLE A (int Id IDENTITY(1,1) NOT NULL, othercolumns, primary key, ect.)
CREATE TABLE B (int Id NOT NULL, othercolumns, primary key, ect.)
CREATE VIEW MyView AS SELECT * FROM A UNION ALL SELECT * FROM B
CREATE TRIGGER TR_INSTEADOFINSERT_ON_MyView on MyView
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO A (columns)
SELECT data
FROM inserted
END
Eu queria saber se a exibição é recriada toda vez que uma inserção é feita na exibição. Porque se eu verificar no sys.dm_exec_sessions e sys.db_exec_requests, sempre vejo o "CREATE TRIGGER TR_INSTEADOFINSERT" no texto da consulta a ser executado.
Agora sei que está demorando muito porque é uma mesa grande e tenho muita atividade no servidor. Mas eu só queria saber porque continuo vendo o "CREATE TRIGGER" no sql_text da query sendo executada? É recriado ou não? Qual é a maneira mais eficiente de fazer isso? Devo modificar os programas para referenciar a tabela diretamente ao inserir?
O gatilho não está sendo recriado. sql_text em sys.db_exec_requests está no nível de lote, não no nível de consulta. Veja, por exemplo
https://blogs.msdn.microsoft.com/dbrowne/2013/01/18/my-favorite-query-for-investigating-sql-server-performance/
Para obter um exemplo de como analisar a consulta em execução no lote maior.
Essa espera é buscar a página na qual a linha foi gravada, no Índice clusterizado ou em algum índice não clusterizado. Então, eu olharia para o design do índice da tabela e veria se deveria ser melhor otimizado para inserções.