1

次のクエリで、「SELECT [Nominal]...」と同じように実行すると、1 秒以内に実行され、12000 を超える結果が返されます。

ただし、TOP 5実行に 7 分以上かかるため、最終的には期待どおりの答えが得られます。

これを部分的に回避するには、一時テーブルに配置して、TOP 5そこから a を実行します。ただし、これを の変数句を持つ関数に組み込む必要があります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% 内部結合は 2 つの入れ子になったループに置き換えられたようです (入れ子になったループとハッシュ マッチの正確な違いと、なぜ 2 つ必要なのかはわかりませんが、費用はありません)

ポインターは誰ですか?

4

0 に答える 0