从表值函数中选择TOP TOP比选择所有行慢得多

时间:2017-11-23 21:43:21

标签: sql-server sql-server-2008 sql-server-2014

我有一个表值函数,它返回四行:

SELECT * 
FROM dbo.GetStuff('0D182B8B-7A80-4D45-8900-23FA01FCFE5A')
ORDER BY TurboEncabulatorID DESC

然后快速返回(< 1s):

TurboEncabulatorID  Trunion  Casing  StatorSlots
------------------  -------  ------  -----------
4                   G        Red     19
3                   F        Pink    24
2                   H        Maroon  17
1                   G        Purple  32

但我只是想要"最后"行(即具有最高TurboEncabulatorID的行)。所以我添加了TOP

SELECT TOP 1 * 
FROM dbo.GetStuff('0D182B8B-7A80-4D45-8900-23FA01FCFE5A')
ORDER BY TurboEncabulatorID DESC

此查询需要大约40秒才能运行,其中包含巨大的I / O数量,以及更糟糕的查询计划。

显然这是优化器的一个问题 - 但我该如何解决呢?

  • 我已更新所有统计信息
  • 我重建了所有索引

奖金阅读

1 个答案:

答案 0 :(得分:0)

我提出的解决方法,显然不是一个答案,是试图混淆优化器:

  • 选择前1行
  • 来自行数的前100%
  • 来自表值函数

换句话说:

WITH optimizerWorkaround AS
(
   SELECT TOP 1 PERCENT *
   FROM dbo.GetStuff('0D182B8B-7A80-4D45-8900-23FA01FCFE5A')
   ORDER BY TurboEncabulatorID DESC
)
SELECT TOP 1 *
FROM optimizerWorkaround 
ORDER BY TurboEncabulatorID DESC

这很快就会恢复,好像我一开始没有TOP。