2010-01-29 8 views
5

En SQL Server 2005, cuando escribo una consulta comoUtilizando la misma función dos veces en una consulta (SQL Server)

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 

se calcula my_hash_function(m.name) dos veces o una sola vez? Si es dos veces, ¿cómo puedo usar una variable para evitar eso?

Respuesta

2

El plan de ejecución muestra que de hecho se ejecuta dos veces. Pero esto se cumple solo si la función no es determinista. Para que una función sea determinista, debe definirse la opción WITH SCHEMABINDING, y todas las funciones que llama deben ser también deterministas. Después de definir la función hash como determinista, el plan ha cambiado. ¡Ahora se ejecuta solo una vez!

Sin embargo, si no quiere molestarse con esas cosas, la solución de momobo funciona igual de bien.

7
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 
+0

Oh, entiendo la idea. ¡Gracias! ¿Sabes si se ejecutaría dos veces o no? – ercan

+0

Creo que depende del razonamiento del optimizador. No lo sé, pero supongo que no. – momobo

Cuestiones relacionadas