В SQL Server 2005, когда я пишу запрос как
SELECT m.*, a.price p1, b.price p2
FROM mytable m
LEFT JOIN products_table_1 a
ON my_hash_function(m.name) = a.hash
LEFT JOIN products_table_2 b
ON my_hash_function(m.name) = b.hash
my_hash_function(m.name)
вычисленный дважды или только однажды? Если дважды, как я могу использовать переменную для предотвращения этого?
План выполнения показывает, что он действительно выполняется дважды. Но это верно, только если функция не детерминированная . Чтобы функция была детерминированной, она должна быть определена с параметром WITH SCHEMABINDING
, и все функции, которые она вызывает, также должны быть детерминированными. После того, как я определил хеш-функцию как детерминированную, план изменился. Теперь он выполняется только один раз!
Однако, если вы не хотите возиться с этим, решение momobo работает точно так же.
select mm.*, a.price p1, b.price p2 from
(SELECT m.*, my_hash_function(m.name) as name
FROM mytable m) mm
LEFT JOIN products_table_1 a
ON mm.name = a.hash
LEFT JOIN products_table_2 b
ON mm.name = b.hash