Это простой выбор из временной таблицы, оставляющий присоединение к существующей таблице по его первичному ключу, с двумя подвыборками, использующими top 1 со ссылкой на объединенную таблицу.
В коде:
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)
Это точная копия моего запроса.
Если я удаляю два суб-выбора, он работает просто отлично и быстро. С двумя вложенными выборками я получаю около 100 записей в секунду, что крайне медленно для этого запроса, поскольку он должен возвращать почти миллион записей.
Я проверил, есть ли у каждой таблицы первичный ключ, все они имеют. Все они имеют индексы И статистику для своих важных столбцов, например, в этих предложениях WHERE и в предложениях JOIN. Единственная таблица, для которой не определен ни первичный ключ, ни индекс, является временной таблицей, но это не проблема, потому что она не связана с медленным суб-выбором, и, как я уже говорил, без суб-выбора она работает просто отлично.
Без них TOP 1
он возвращает более одного результата и выдает ошибку.
Помогите кому-нибудь?
РЕДАКТИРОВАТЬ :
Таким образом, план выполнения сказал мне, что я пропустил Индекс. Я создал его и пересоздал некоторые другие индексы. Через некоторое время план выполнения использовал их, и теперь запрос выполняется быстро. Единственная проблема в том, что мне не удалось сделать это снова на другом сервере, для того же запроса. Так что моим решением будет HINT, какой индекс будет использовать SQL Server.