【问题标题】:ORDER BY is taking too much time when executed for VIEWORDER BY 在为 VIEW 执行时花费了太多时间
【发布时间】:2014-09-15 09:03:08
【问题描述】:

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

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

由于我对SQL 了解甚少,因此我不确定这里的最佳选择是什么。即使执行时间是固定的,与整个查询所需的时间相比,我也不希望我的Order by 子句花费太多时间。如果我可以像直接在查询中执行它时一样快 - 当我不使用视图并将ORDER BY 添加到初始query 时,原始时间是 24 秒,然后它会上升到 36,百分比仍然比从视图中执行相同的 ORDER BY 函数时的性能好得多。

所以我的问题是 - 是什么导致 ORDER BY 从视图中执行如此缓慢,我怎样才能让它像原始查询的一部分一样快,另外,如果这是不可能的,如何我可以减少花费的大量时间吗?

【问题讨论】:

  • 据我了解,您不应该使用 order by 定义视图,因为当您实际调用视图时,它不会(必然)被订购。如果您需要它,请在调用时明确排序。如果在显式排序时速度很慢,请确保您正在使用的源列上有索引。

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


【解决方案1】:

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

我发现这个问题的替代方案是使用表值函数路由,因为它似乎使用与运行查询相同的执行计划。

下面是关于表值函数的不错的文章: http://technet.microsoft.com/en-us/library/ms191165(v=sql.105).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2017-02-15
    • 2020-07-23
    • 2013-07-11
    相关资源
    最近更新 更多