2012-02-23 12 views
5

si tengo una funciónSQL re-evalulate la función para cada fila o sólo una vez, convirtiéndola en una constante

ALTER FUNCTION [dbo].[GetCycleDate] 
(
) 
RETURNS DATE 
AS 
    BEGIN 
     DECLARE @CYC_DT DATE 

     SELECT 
      @CYC_DT = CYC_DT 
     FROM 
      CYC_DT 
     WHERE 
      CURR_CYC_IND = 'C' 

     RETURN @CYC_DT 

END 

Para una tabla muy grande, serán estas dos LSQ realizar casi la misma?

SELECT 
    * 
FROM 
    [dbo].Table S 
    INNER JOIN dbo.CYC_DT D ON 
     S.GL_DT = D.CYC_DT AND 
     D.CURR_CYC_IND = 'C' 


SELECT 
    * 
FROM 
    [dbo].Table S 
WHERE 

    S.GL_DT = dbo.GetCycleDate() 

Sé evitando la función es más seguro, pero para los propósitos de prueba, que quieren ser capaces de manipular la función para devolver un resultado codificado sin impactar en las pruebas realizadas por otras personas que están confiando en una fecha diferente para establecerse en la tabla de fecha del ciclo. Quiero poder cambiar a una fecha diferente en el sin impactar a nadie más.

Respuesta

2

generalmente una mala idea hacer esto, ya que el optimizador es más limitada en lo que puede hacer por usted cuando UDF escalares están involucrados .:

http://blogs.msdn.com/b/dfurman/archive/2009/12/02/query-performance-scalar-udfs-and-predicate-pushdown.aspx

http://www.sql-server-performance.com/2005/sql-server-udfs/

Desde su UDF escalares no está parametrizado, y su consulta de muestra es simple, puede salirse con la suya, pero tendría que probar para estar seguro.

Cuestiones relacionadas