我有一个情境/上下文,其中特定视图在返回结果之前需要120秒。在执行简单的ALTER(或删除/创建)时,视图需要1到2秒。这怎么可能?我们如何解决这个问题 - 因为我们没有可以帮助我们的专职DBA。由于我们拥有链接服务器设置(MSSQL Server 2012抱怨这一点),因此制作索引视图不是一种选择。
以下是有关设置的信息。
TL; DR View_MAIN在一段时间后需要120秒。当我们在View_X,View_Y和View_MAIN上执行ALTER视图而不改变任何内容时,性能再次恢复正常为1到2秒。
View_MAIN
SELECT
column1, column2, column3, column4, column5
FROM View_X
UNION ALL
SELECT
column1, column2, column3, column4, column5
FROM View_Y
View_X
SELECT
LTRIM(RTRIM(table1.a)) as column1,
table2.b COLLATE Latin1_General_CI_AS as column2,
table1.c as column3,
CAST(table3.d AS DATETIME) as column4,
'XXXXXX' as column5
FROM
[linkedserver01].[DATABASE_IDN].[dbo].[dataForX] table1
LEFT OUTER JOIN [linkedserver02].[DATABASE_INFM] as table2
ON table2.id = table1.id
LEFT OUTER JOIN [linkedserver02].[DATABASE_PIK] as table3
ON table3.id = table1.id
View_Y
SELECT
LTRIM(RTRIM(table1.a)) as column1,
table2.b COLLATE Latin1_General_CI_AS as column2,
table1.c as column3,
CAST(table3.d AS DATETIME) as column4,
'YYYYY' as column5
FROM
[linkedserver01].[DATABASE_IDN].[dbo].[dataForY] table1
LEFT OUTER JOIN [linkedserver02].[DATABASE_INFM] as table2
ON table2.id = table1.id
LEFT OUTER JOIN [linkedserver02].[DATABASE_PIK] as table3
ON table3.id = table1.id
答案 0 :(得分:6)
通过更改或重新创建视图,您将清除为此存在的缓存执行计划,并根据当前数据集重新创建它。
执行sp_recompile 'View_Main'
https://technet.microsoft.com/en-us/library/ms181055(v=sql.105).aspx
查看查询的实际执行计划应该是确定它运行缓慢的原因的起点(在SSMS中,在“查询”菜单上)
答案 1 :(得分:2)
您最好的选择是根据您的需要,消除链接的服务器并加载分析数据库中所需的数据或任何需要的数据。 除此之外,我只能猜测有人或某个应用程序查询视图并生成错误的执行计划。可能是它完全低估或高估了结果集。你可以尝试
EXEC sp_updatestats
在查询视图之前,或者您可以尝试Query Hints重新编译,如果没有其他任何帮助或更好的选项快速。如果你可以估计视图通常返回的行数,让我们说它的50.000行,你可以尝试:
SELECT * FROM View_MAIN OPTION (FAST 50000);
编辑:
为什么我建议摆脱链接的服务器:
如果您被迫使用链接服务器,请考虑OPENQUERY。这样,聚合将在SQL服务器上执行。