执行后 MSSQL 2012 查看速度更快 "alter"
MSSQL 2012 view faster after executing "alter"
我有一个 situation/context,其中特定视图需要 120 秒才能返回结果。执行简单的 ALTER(或 drop/create)时,视图需要 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
通过更改或重新创建视图,您将清除为此存在的缓存执行计划,并根据当前数据集重新创建它。
执行sp_recompile 'View_Main'
也可以达到同样的效果
https://technet.microsoft.com/en-us/library/ms181055(v=sql.105).aspx
查看查询的实际执行计划应该是确定它为什么 运行 缓慢的起点(在 SSMS 中,在“查询”菜单上)
您最好的选择是取消链接服务器,并根据您的需要,将所需的数据加载到您的分析数据库或您需要的任何地方。
除此之外,我只能猜测有人或某些应用程序查询视图并生成错误的执行计划。可能是它完全低估或高估了结果集。你可以试试
EXEC sp_updatestats
在查询视图之前,或者您可以尝试 Query Hints 重新编译,如果真的没有其他帮助或更好的选择快速。如果您可以估计视图通常的行数 returns,比如说它的 50.000 行,您可以尝试:
SELECT * FROM View_MAIN OPTION (FAST 50000);
编辑:
为什么我建议摆脱链接服务器:
- 您缺少通用的数据库日志记录、统计信息、执行计划等。
- 一旦您没有 dbo 或类似权限,您将无法使用统计信息,从而导致跨链接服务器连接的性能不佳。
- 您大多会得到完整的结果,然后再组织数据加入。因此,请尝试加入来自远程服务器的尽可能小的结果集。
- 如果您无权访问目标服务器,则不知道您的查询是否在目标服务器上陷入僵局。
如果您被迫使用链接服务器,请考虑 OPENQUERY。这样聚合将在您的 SQL 服务器上执行。
我有一个 situation/context,其中特定视图需要 120 秒才能返回结果。执行简单的 ALTER(或 drop/create)时,视图需要 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
通过更改或重新创建视图,您将清除为此存在的缓存执行计划,并根据当前数据集重新创建它。
执行sp_recompile 'View_Main'
https://technet.microsoft.com/en-us/library/ms181055(v=sql.105).aspx
查看查询的实际执行计划应该是确定它为什么 运行 缓慢的起点(在 SSMS 中,在“查询”菜单上)
您最好的选择是取消链接服务器,并根据您的需要,将所需的数据加载到您的分析数据库或您需要的任何地方。 除此之外,我只能猜测有人或某些应用程序查询视图并生成错误的执行计划。可能是它完全低估或高估了结果集。你可以试试
EXEC sp_updatestats
在查询视图之前,或者您可以尝试 Query Hints 重新编译,如果真的没有其他帮助或更好的选择快速。如果您可以估计视图通常的行数 returns,比如说它的 50.000 行,您可以尝试:
SELECT * FROM View_MAIN OPTION (FAST 50000);
编辑:
为什么我建议摆脱链接服务器:
- 您缺少通用的数据库日志记录、统计信息、执行计划等。
- 一旦您没有 dbo 或类似权限,您将无法使用统计信息,从而导致跨链接服务器连接的性能不佳。
- 您大多会得到完整的结果,然后再组织数据加入。因此,请尝试加入来自远程服务器的尽可能小的结果集。
- 如果您无权访问目标服务器,则不知道您的查询是否在目标服务器上陷入僵局。
如果您被迫使用链接服务器,请考虑 OPENQUERY。这样聚合将在您的 SQL 服务器上执行。