ORDER BY在执行VIEW时花费了太多时间

时间:2014-09-15 09:03:08

标签: sql-server sql-order-by sql-view

我有一个相对复杂的设置。我正在使用SQL Server 2012和3个链接服务器,它们是IBM DB2服务器。我有几个查询连接所有三个链接服务器的表来获取数据。由于我正在使用的版本的某些细节,我无法直接使用某些OLAP函数,因此升级不是一个选项,解决方法是创建视图并在视图上执行这些功能。我现在面临的一个问题是,从视图中使用ORDER BY几乎会使视图执行所需的时间增加三倍。

当我执行SELECT时只需要24秒(是的,我知道我们在这里谈论荒谬的时间,但是,我仍然希望通过订单解决问题,因为我不允许将查询更改为DB2服务器,但order by在我这边),当我使用ORDER BY时,它会从68到80秒,具体取决于我订购的列。我无法创建模式绑定视图,因为它现在允许OpenQuery,我已经读过了在创建视图时不允许使用ORDER BY,我没有尝试过,但是因为我需要除了我创建的列数与我所拥有的那些听起来有点荒谬但是... dunno之外,它不是一个选项。

由于我总体上对SQL有一些琐碎的了解,所以我不确定这里最好的选择是什么。即使执行时间是固定的,我也不希望我的Order by子句与整个查询所需的时间相比耗费大量时间。如果我可以在查询中直接执行它时尽可能快 - 当我不使用视图时,我将ORDER BY添加到初始query,原始时间为24秒,然后它上升到36,当从视图执行相同的ORDER BY函数时,百分比仍然比性能好很多。

所以我的问题是 - 是什么原因导致ORDER BY从视图中执行得如此之慢以及我如何能够像原始查询一样快速地执行它,如果这是不可能的话,我怎样才能减少花费的大量时间?

1 个答案:

答案 0 :(得分:1)

视图使用与制作它们的查询不同的执行计划。在我看来,这是一个观点的缺点。 ORDER BY是一个特别昂贵的命令,因此它使执行计划的差异非常明显。

我发现这个问题的替代方法是使用Table Valued Function路由,因为它似乎使用与运行查询相同的执行计划。

这是表值函数的一个不错的写法: http://technet.microsoft.com/en-us/library/ms191165(v=sql.105).aspx