执行“alter”后MSSQL 2012查看速度更快

时间:2016-05-10 12:32:12

标签: sql-server sql-view sqlperformance

我有一个情境/上下文,其中特定视图在返回结果之前需要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

2 个答案:

答案 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);

编辑:

为什么我建议摆脱链接的服务器:

  1. 您缺少常规数据库日志记录,统计信息,执行计划等。
  2. 一旦您没有dbo或类似权限,您将无法使用统计信息,从而导致链接服务器连接的性能下降。
  3. 您最常获得完整的结果,之后会组织数据加入。因此,尝试从远程服务器加入尽可能小的结果集。
  4. 如果您无权访问目标服务器,则不知道您的查询是否已死锁。
  5. 如果您被迫使用链接服务器,请考虑OPENQUERY。这样,聚合将在SQL服务器上执行。