1

在下面的查询中,如果我以“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,最昂贵的是表扫描 [Documents],成本:100% 内部连接似乎已被两个嵌套循环替换(不确定嵌套循环和哈希匹配的确切区别以及为什么它需要两个但费用不存在)

有人指点吗?

4

0 回答 0