相关文章推荐

SQL Server - 连接4个快速查询给我一个慢速查询

2 人关注

在我的MS Sql Server数据库中,有4个视图,它们都相当快(少于2秒),并且返回的数据都少于50行。

但是,当我创建一个连接这4个视图的查询时(左外连接),我得到一个几乎需要一分钟才能完成的查询。

我认为查询优化器在这里做得很糟糕,有没有什么方法可以加快这个速度。我很想把4个视图中的每一个都复制到一个表中,然后把它们连接在一起,但这对我来说似乎是一个太多变通的办法。

(注:我不能在任何表上设置任何索引,因为视图来自不同的数据库,我不允许在那里改变任何东西,所以这不是一个选项)

编辑: 我很抱歉,但我不认为贴出sql查询会有帮助。它们相当复杂,使用了大约50个不同的表。我也不能发布执行计划,因为我没有足够的访问权限来生成某些数据库的执行计划。

我想我现在最好的解决办法是生成临时表来存储每个查询的结果。

3 个评论
如果不分享视图中的SQL或查询计划的结果,你就不可能得到任何有意义的答案。
大多数DBA都愿意授予 "标准 "的开发者权利。 GRANT SHOWPLAN TO YourUser; GRANT ALTER TRACE TO YourUser; GRANT VIEW SERVER STATE TO YourUser; 拥有这些权利会使你的工作变得更加容易。
@Andomar:谢谢你,我会把这些信息转发给我的数据库管理员。
sql
sql-server
performance
sql-server-2008
Preli
Preli
发布于 2012-07-30
3 个回答
Andrea Colleoni
Andrea Colleoni
发布于 2012-07-30
已采纳
0 人赞同

如果你不能碰索引,为了加快速度,你可以把4个查询的结果放在4个临时表里,然后连接它们。

你可以在一个存储过程中这样做。

临时表的工作很好。我使用4条语句'SELECT * INTO #table1 from view1',然后连接这些表。结果在2秒内完成,而不是54秒。谢谢你。
Pinakee Das
Pinakee Das
发布于 2012-07-30
0 人赞同

你可以在连接时拥有视图的派生表。

例子:不要有这样的查询

 SELECT V1.* FROM dbo.View1 AS V1 INNER JOIN dbo.View2 as V2
     ON V1.Column1=V2.Column1;

你可以有以下查询

 SELECT V1.* FROM (SELECT * FROM dbo.View1) AS V1 INNER JOIN (SELECT * FROM dbo.View2) AS V2
     ON V1.Column1=V2.Column1;
 
推荐文章