これは一時テーブルからの単純な選択であり、既存のテーブルを主キーに結合したままにします。結合されたテーブルを参照するトップ1を使用する2つのサブ選択があります。
コードで:
SELECT
TempTable.Col1,
TempTable.Col2,
TempTable.Col3,
JoinedTable.Col1,
JoinedTable.Col2,
(
SELECT TOP 1
ThirdTable.Col1 -- Which is ThirdTable's Primary Key
FROM
ThirdTable
WHERE
ThirdTable.SomeColumn = JoinedTable.SomeColumn
) as ThirdTableColumn1,
(
SELECT TOP 1
ThirdTable.Col1 -- Which is also ThirdTable's Primary Key
FROM
ThirdTable
WHERE
ThirdTable.SomeOtherColumn = JoinedTable.SomeColumn
) as ThirdTableColumn2,
FROM
#TempTable as TempTable
LEFT JOIN
JoinedTable
ON (TempTable.PKColumn1 = JoinedTable.PKColumn1 AND
TempTable.PKColumn2 = JoinedTable.PKColumn2)
WHERE
JoinedTable.WhereColumn IN (1, 3)
これは私のクエリの正確なレプリカです。
2つのサブ選択を削除すると、うまく実行されます。2つのサブ選択を使用すると、1秒あたり約100レコードを取得します。これは、ほぼ100万のレコードを返す必要があるため、このクエリでは非常に低速です。
すべてのテーブルに主キーがあるかどうかを確認しましたが、すべて主キーがあります。それらはすべて、それらのWHERE句にあるものやJOIN句にあるもののように、重要な列のインデックスと統計を持っています。主キーもインデックスも定義されていない唯一のテーブルは一時テーブルですが、遅い副選択に関連するものではないため問題でもありません。前述したように、副選択がないため、問題なく実行されます。
これらがないTOP 1
と、複数の結果が返され、エラーが発生します。
誰か助けて?
編集:
そのため、実行計画では、インデックスが不足していると言われました。私はそれを作成し、他のいくつかのインデックスを再作成しました。しばらくすると、実行プランはそれらを使用していたため、クエリは高速に実行されます。唯一の問題は、同じクエリに対して、別のサーバーでこれを再度実行できないことです。したがって、私の解決策は、SQL Serverが使用するインデックスをHINTすることです。