Como se puede hacer este Select

22/06/2006 - 07:01 por Carlos Gómez | Informe spam
De que forma se puede realizar esta consulta (que obviamente esta mal)

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE LaFuncion > 3 --Esto es lo que obviamente esta mal
ORDER BY LaFuncion

Lo que quiero evitar es evaluar 2 veces la dbo.Funcion -la cual devuelve un
numero- ya que es algo pesada teniendo en cuenta el numero de registros, es
decir: lo siguiente es lo que quiero evitar, pero en definitiva es este el
resultado que deseo:

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE dbo.Funcion(Nombre,'Parametro') > 3
ORDER BY LaFuncion

Ah, si es posible realizarla sin crear una tabla temporal y demas...
Desde Aguadulce - España
Carlos Gomez

Preguntas similare

Leer las respuestas

#1 J.A. García Barceló
22/06/2006 - 08:32 | Informe spam
SELECT AUX.Nombre, AUX.LaFuncion FROM
(SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas) AUX
WHERE AUX.LaFuncion>3
ORDER BY AUX.LaFuncion

En cualquier caso, no estoy seguro de si usando la construccion original
(sin subselects) realmente se evalúe la función 2 veces a pesar de que la
pongas dentro de la cláusula Where. Siempre he pensado que el optimizador de
consultas, al ver que es una función, intentaría algo 'inteligente' antes
que evaluarla de nuevo para ver si se cumple la condición. A este respecto,
también yo espero alguna respuesta de alguien más puesto en el tema.

J.A. García Barceló
http://jagbarcelo.blogspot.com/

"Carlos Gómez" escribió en el mensaje
news:
De que forma se puede realizar esta consulta (que obviamente esta mal)

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE LaFuncion > 3 --Esto es lo que obviamente esta mal
ORDER BY LaFuncion

Lo que quiero evitar es evaluar 2 veces la dbo.Funcion -la cual devuelve
un
numero- ya que es algo pesada teniendo en cuenta el numero de registros,
es
decir: lo siguiente es lo que quiero evitar, pero en definitiva es este el
resultado que deseo:

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE dbo.Funcion(Nombre,'Parametro') > 3
ORDER BY LaFuncion

Ah, si es posible realizarla sin crear una tabla temporal y demas...
Desde Aguadulce - España
Carlos Gomez
Respuesta Responder a este mensaje
#2 Maxi
22/06/2006 - 17:58 | Informe spam
Hola, no tenes otra alternativa en SQL de hacer eso. De hecho es lento
porque una de las cosas es no usas funciones en los Where ya que el motor
debe recorrer fila por fila.

Opciones: Te podes crear un campo calculado en la tabla que retorne la
funcion y luego hacer un indices por ese campo calculado y lo que haces en
el select es llamarlo en lugar de pasar la funcion.


Salu2
Maxi [MVP SQL SERVER]
www.sqlgurus.org


"Carlos Gómez" escribió en el mensaje
news:
De que forma se puede realizar esta consulta (que obviamente esta mal)

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE LaFuncion > 3 --Esto es lo que obviamente esta mal
ORDER BY LaFuncion

Lo que quiero evitar es evaluar 2 veces la dbo.Funcion -la cual devuelve
un
numero- ya que es algo pesada teniendo en cuenta el numero de registros,
es
decir: lo siguiente es lo que quiero evitar, pero en definitiva es este el
resultado que deseo:

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE dbo.Funcion(Nombre,'Parametro') > 3
ORDER BY LaFuncion

Ah, si es posible realizarla sin crear una tabla temporal y demas...
Desde Aguadulce - España
Carlos Gomez
Respuesta Responder a este mensaje
#3 Ele
22/06/2006 - 18:00 | Informe spam
Hola y que es lo que hace la Funcion?

"Carlos Gómez" escribió en el mensaje
news:
De que forma se puede realizar esta consulta (que obviamente esta mal)

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE LaFuncion > 3 --Esto es lo que obviamente esta mal
ORDER BY LaFuncion

Lo que quiero evitar es evaluar 2 veces la dbo.Funcion -la cual devuelve
un
numero- ya que es algo pesada teniendo en cuenta el numero de registros,
es
decir: lo siguiente es lo que quiero evitar, pero en definitiva es este el
resultado que deseo:

SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas
WHERE dbo.Funcion(Nombre,'Parametro') > 3
ORDER BY LaFuncion

Ah, si es posible realizarla sin crear una tabla temporal y demas...
Desde Aguadulce - España
Carlos Gomez
Respuesta Responder a este mensaje
#4 Carlos Gómez
22/06/2006 - 19:17 | Informe spam
Maxi wrote:

Hola, no tenes otra alternativa en SQL de hacer eso. De hecho es lento
porque una de las cosas es no usas funciones en los Where ya que el motor
debe recorrer fila por fila.

Opciones: Te podes crear un campo calculado en la tabla que retorne la
funcion y luego hacer un indices por ese campo calculado y lo que haces en
el select es llamarlo en lugar de pasar la funcion.




Esa opcion no vale, ya que la funcion usa un parametro que se lo paso por
programa: la funcion tiene 2 parametros, uno que es un campo del registro,
y otro, que se pasa por programa...
Desde Aguadulce - España
Carlos Gomez
Respuesta Responder a este mensaje
#5 Carlos Gómez
22/06/2006 - 19:29 | Informe spam
J.A. García Barceló wrote:

SELECT AUX.Nombre, AUX.LaFuncion FROM
(SELECT Nombre, dbo.Funcion(Nombre,'Parametro') As LaFuncion
FROM Personas) AUX
WHERE AUX.LaFuncion>3
ORDER BY AUX.LaFuncion

En cualquier caso, no estoy seguro de si usando la construccion original
(sin subselects) realmente se evalúe la función 2 veces a pesar de que la
pongas dentro de la cláusula Where. Siempre he pensado que el optimizador
de consultas, al ver que es una función, intentaría algo 'inteligente'
antes que evaluarla de nuevo para ver si se cumple la condición



Eso mismo es lo que yo no tengo claro, pero me parece a mi que los
optimizadores son bastante menos 'inteligentes' que lo que deseariamos, y
el uso de la palabra 'inteligencia' se basa más en marketing que en hechos.
Ojo, no menosprecio el optimizador, pero el uso de palabras tan abstractas
como inteligencia, nos da pie a suponer que es capaz de realizar
automaticamente mas acciones de las que realmente se han previsto
Desde Aguadulce - España
Carlos Gomez
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida