在下面的查询中,如果我将其作为“SELECT [Nominal] ...”运行,那么它将在不到一秒的时间内执行并返回超过12000个结果。
但是,TOP 5
执行需要7分钟,最终会得到预期的答案。
为了部分解决这个问题,我可以把它放到临时表中,然后从那里做TOP 5
。但是我需要将它合并到一个带有PrID
的变量子句的函数中。但是函数不适用于临时表。将整个查询放在函数中将重新引入7分钟的延迟。
最后,我无法重新设计现有的或创建新的永久表。
SELECT TOP 5
[Nominal].[OwId],
[Nominal].[PrID],
CASE
WHEN ISNULL(Archived, 0) = 0
THEN '.\Document Store\ '
WHEN [Archived] = 1
THEN '.\Archive Store\ '
END +
CASE
WHEN [Documents].Spare1 IS NOT NULL
THEN CONVERT(nVarChar(50),[Documents].Spare1)
WHEN [Documents].Spare1 IS NULL
THEN CONVERT(nVarChar(50),[Documents].ID)
END
+ '.pdf' AS [File Name],
[Documents].[Date],
[Nominal].[Statement Number],
[Nominal].[Total]
FROM [Documents]
INNER JOIN [Nominal]
ON [Document Name] =
REPLACE(
REPLACE(
'Statement - '
+ [account]
+ ' '
+ CONVERT(nVarChar(50),[Statement Number]),
'/',
' '),
',',
'')
ORDER BY [Statement Number];
编辑,回复评论:
我对这一切都不太熟悉,我不得不谷歌大部分评论。现在我可以看到问题所在:
如果没有TOP 5,最贵的是哈希比赛(内联赛),费用:76% 预期,因为整个事情只需几秒钟就不成问题了。
使用TOP 5,最昂贵的是表扫描[文档],成本:100% 内连接似乎已被两个嵌套循环所取代(不确定嵌套循环和哈希匹配的确切差异以及为什么它需要两个但成本不存在)
指点任何人?