Eu tenho quatro tabelas idênticas em quatro servidores que preciso consultar em um quinto. O quinto servidor está vinculado aos outros quatro e possui uma visão criada para unificá-los.
-- Servers 1-4
CREATE TABLE Transactions
(
TxID int not null primary key,
Description nvarchar(50) not null
);
-- Server 5
CREATE VIEW vwTransactions
AS
SELECT 1 as ServerID, * FROM Server1.DB.dbo.Transactions
UNION ALL
SELECT 2 as ServerID, * FROM Server2.DB.dbo.Transactions
UNION ALL
SELECT 3 as ServerID, * FROM Server3.DB.dbo.Transactions
UNION ALL
SELECT 4 as ServerID, * FROM Server4.DB.dbo.Transactions;
Quando executo uma consulta com uma cláusula where constante na ServerID
coluna, recebo um bom plano de consulta feliz que elimina três das partições.
SELECT * FROM vwTransactions WHERE ServerID = 1;
Mas quando uso um parâmetro, ou pior – uma junção, recebo uma varredura de todas as quatro tabelas.
DECLARE @ServerID int = 1;
SELECT *
FROM vwTransactions
WHERE ServerID = @ServerID;
Eu também tentei usar funções com valor de tabela inline sem sucesso.
Como faço uma visualização dessas tabelas que podem ser consultadas facilmente?
Nesse caso, adicionar uma
OPTION(RECOMPILE)
dica à consulta fornecerá o plano desejado.A dica permite que o SQL Server compile um plano específico para o valor atual de
@ServerID
. Mais especificamente, habilita a Otimização de Incorporação de Parâmetros, o que significa que a consulta é compilada como se você tivesse escritoWHERE ServerID = 1
, permitindo a eliminação de partições.