我在四台服务器上有四个相同的表,我需要从第五台服务器上查询。第五个服务器链接到其他四个,并创建了一个视图来统一它们。
-- 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;
当我在列上运行一个带有常量 where 子句的查询时ServerID
,我得到了一个非常愉快的查询计划,它消除了三个分区。
SELECT * FROM vwTransactions WHERE ServerID = 1;
但是当我使用一个参数,或者更糟的是——一个连接时,我得到了所有四个表的扫描。
DECLARE @ServerID int = 1;
SELECT *
FROM vwTransactions
WHERE ServerID = @ServerID;
我也尝试过使用内联表值函数无济于事。
如何查看这些可以轻松查询的表?
在这种情况下,向
OPTION(RECOMPILE)
查询添加提示将使您获得所需的计划。该提示允许 SQL Server 编译一个特定于当前值的计划
@ServerID
。更具体地说,它启用了参数嵌入优化,这意味着查询的编译就像您编写的一样WHERE ServerID = 1
,允许分区消除。