Попробуйте это:
LEFT JOIN joinedTable jt
ON jt.someCol = someCol
AND jt.someCol = conditions
AND @neededJoin = 1 -- or whatever indicates join is needed
Я думаю, вы найдете, что это хорошая производительность и делает то, что вам нужно.
Обновление
Если это не дает требуемой производительности, то, возможно, это из-за того, что в последний раз я делал это, используя соединения с таблицей. Требуемое значение может быть получено из одной из 3 таблиц, основанных на 2 столбцах, поэтому я построил таблицу 'join-map' следующим образом:
Col1 Col2 TableCode
1 2 A
1 4 A
1 3 B
1 5 B
2 2 C
2 5 C
1 11 C
Тогда
SELECT
V.*,
LookedUpValue =
CASE M.TableCode
WHEN 'A' THEN A.Value
WHEN 'B' THEN B.Value
WHEN 'C' THEN C.Value
END
FROM
ValueMaster V
INNER JOIN JoinMap M ON V.Col1 = M.oOl1 AND V.Col2 = M.Col2
LEFT JOIN TableA A ON M.TableCode = 'A'
LEFT JOIN TableB B ON M.TableCode = 'B'
LEFT JOIN TableC C ON M.TableCode = 'C'
Это дало мне огромное улучшение производительности запросов к этим таблицам (большинство из них десятки или сотни таблиц с миллионами строк).
Вот почему я спрашиваю, действительно ли вы улучшили производительность. Конечно, он собирается добавить объединение в план выполнения и назначить ему некоторую стоимость, но в целом будет выполнять намного меньше работы , чем какой-то план, который просто без разбора объединяет все 3 таблицы, а затем Coalesce()
s. найти правильное значение.
Если вы обнаружите, что по сравнению с динамическим SQL объединение таким способом обходится только на 5% дороже, но при неразборчивых соединениях это на 100% дороже, возможно, вам стоит сделать это из-за правильности, ясность и простота по сравнению с динамическим SQL, и все это, вероятно, более ценно, чем небольшое улучшение (конечно, в зависимости от того, что вы делаете).
Является ли стоимость шкалы с количеством строк также другим фактором, который необходимо учитывать. Если даже с огромным объемом данных вы экономите только 200 мс ЦП на запросе, который не выполняется десятки раз в секунду, использовать его нетрудно.
Причина, по которой я продолжаю настаивать на том факте, что он будет работать хорошо, заключается в том, что даже при совпадении с хешем у него не будет строк для проверки, или у него не будет строк для создания хеша из. Операция хэширования будет остановлена намного раньше по сравнению с использованием запроса WHERE в стиле OR в вашем первоначальном сообщении.