次のクエリで、「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 つ必要なのかはわかりませんが、費用はありません)
ポインターは誰ですか?