Existem três bancos de dados diferentes em três servidores vinculados separados SQL0
( SQL1
hospedando 2 dbs) SQL2
(hospedando 1 db). SQL0
atua como um servidor de relatórios e hospedará todos os bancos de dados em questão (método TBD - talvez replicação, talvez mais), mas como os dados serão antigos para alguns fins de auditoria (<24H), ainda será necessário executar algumas consultas ao vivo dados.
Duas configurações:
Configuração 1. Localhost\SQL0
- vinculado a SQL1
e SQL2
(cada um usando suas respectivas sa
credenciais para se conectar)
Configuração 2. SQL1
vinculada a SQL2
(novamente, usando sa
credenciais)
A consulta em questão une (por enquanto) 8 tabelas nesses três bancos de dados. No futuro, haverá outro servidor, outro banco de dados e várias outras tabelas unidas na consulta, executadas regularmente pelo agente e os resultados enviados por e-mail. Geralmente retorna menos de 100 linhas, mas é limitado TOP 10
durante o desenvolvimento.
Por que essa consulta SQL2
leva 3s ou menos para ser executada, mas 105s quando executada SQL0
? Contanto que seja apenas tráfego de rede, estou disposto a desconsiderar a execução 30 vezes mais longa, mas se estiver afetando o desempenho dos servidores vinculados, preciso encontrar a estatística da solução.
Todos os servidores estão na mesma LAN, mas SQL2
em outro prédio conectado via VPN.
Tudo está no SSMS, em uma máquina conectada na mesma rede que todas as outras, sem visualizações, sem servidores vinculados a servidores vinculados ou outras "complicações"; Eu tenho acesso a todos os servidores como sa.
O baixo desempenho é porque você está usando o servidor vinculado. Há uma constante diferença de opinião entre desenvolvedores e administradores de banco de dados. Os administradores de banco de dados sabem que as conexões de servidores vinculados são lentas. Os desenvolvedores os querem porque resolvem problemas para eles. Já fui desenvolvedor e administrador de banco de dados e lembro que, como desenvolvedor, pressionei para adicionar o servidor vinculado. Como administrador de banco de dados nos últimos 20 anos, tenho problemas para fotografar o desempenho ruim milhares de vezes para descobrir que uma conexão de servidor vinculada é a causa.
Use a replicação transacional para obter dados em tempo real para seu servidor de relatório. Isso eliminará o atraso de 24 horas e eliminará a necessidade de usar o servidor vinculado. Você também terá um ganho de desempenho em seus servidores de origem porque as consultas de relatórios somente leitura não competirão com as transações ativas que administram sua empresa.
O que você pode estar enfrentando é o fato de que, ao consultar o servidor remoto para JOIN em tabelas locais ou aplicar a cláusula WHERE, todo o conjunto de dados está sendo trazido de volta pela rede e, em seguida, filtrado localmente.
Você pode estar melhor com OPENQUERY, caso em que a cláusula WHERE será executada no host remoto e somente o subconjunto necessário será retornado.
Se você precisar de junções entre servidores, deve começar a procurar ferramentas ETL.