从视图中选择时间过长

时间:2016-07-21 02:32:09

标签: sql sql-server select sql-view

我对使用链接服务器包含200万行的表进行查询。

Select * from OPENQUERY(LinkedServerName,
'SELECT
 PV.col1
,PV.col2
,PV.col3
,VTR.col1
,CTR.col1
,PSR.col1
FROM 
LinkedDbName.dbo.tbl1 PV
INNER JOIN LinkedDbName.dbo.tbl2 VTR 
ON PV.col_id = VTR.col_id
INNER JOIN LinkedDbName.dbo.tbl3 CTR 
ON PV.col_id = CTR.col_id
INNER JOIN LinkedDbName.dbo.tbl4 PSR 
ON PV.col_id = PSR.col_id
WHERE
PV.col_id = ''80C53C9B-6272-11DA-BB34-000E0C7F3ED2''')

该查询结果为365行,并在0秒内执行。 但是,当我将查询放入视图时,它运行大约至少20秒,有时达到40秒。

这是我的创建视图脚本

CREATE VIEW [dbo].[myview]
AS
Select * from OPENQUERY(LinkedServerName,
'SELECT
 PV.col1
,PV.col2
,PV.col3
,VTR.col1
,CTR.col1
,PSR.col1
FROM 
LinkedDbName.dbo.tbl1 PV
INNER JOIN LinkedDbName.dbo.tbl2 VTR 
ON PV.col_id = VTR.col_id
INNER JOIN LinkedDbName.dbo.tbl3 CTR 
ON PV.col_id = CTR.col_id
INNER JOIN LinkedDbName.dbo.tbl4 PSR 
ON PV.col_id = PSR.col_id')

然后

Select * from myview where PV.col_id = '80C53C9B-6272-11DA-BB34-000E0C7F3ED2'

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:3)

您的查询完全不同。在第一个中,where子句是传递给OPENQUERY()的SQL语句的一部分。这有两个重要的影响:

  • 返回的数据量要小得多,只是符合条件的行。
  • 可以使用WHERE子句优化查询。

如果您需要共享该表,我可能会建议您在本地服务器上进行复制 - 使用复制或安排作业进行复制。