我正在优化视图的性能,以收集2个链接服务器对象的数据。
所以视图在服务器A上。 该视图从服务器B和C中选择数据。
当我打开脚本时,我注意到这个视图总是乱七八糟地使用子子子选择一遍又一遍地查询相同的表......
为了简单起见,我不会发布查询的实际代码(700多行),但我会为您的理解创建一个简单的查询:
SELECT *
FROM [ServerA].myDB.dbo.tableA a
INNER JOIN [ServerA].myDB.dbo.tableB b ON a.field = b.field
LEFT JOIN ( SELECT SUM(field) AS mysum
FROM [ServerA].myDB.dbo.tableB
WHERE field IN ( SELECT MAX(value)
FROM [ServerA].myDB.dbo.tableA
WHERE anotherField IS NOT NULL )
) tbl ON tbl.mysum < b.anotherField
我知道这个查询没有任何意义..这只是为了说明我的观点。
在服务器A上的myDB中创建一个视图以使用SELECT * FROM ServerA.myDB.myLocalView查询表和服务器B会更高效吗?
CREATE VIEW myLocalView
AS
SELECT *
FROM dbo.tableA a
INNER JOIN dbo.tableB b ON a.field = b.field
LEFT JOIN ( SELECT SUM(field) AS mysum
FROM dbo.tableB
WHERE field IN ( SELECT MAX(value)
FROM dbo.tableA
WHERE anotherField IS NOT NULL )
) tbl ON tbl.mysum < b.anotherField
答案 0 :(得分:0)
在我看来,一个很好的解决方案是查询所需的数据并将其放入临时表中,然后在同一服务器上的临时表之间进行连接。
https://www.simple-talk.com/sql/t-sql-programming/temporary-tables-in-sql-server/
通过首先提取数据,然后在本地进行连接,您将看到性能的巨大提升。由于加入期间网络滞后,尝试从服务器加入服务器非常慢。