2013-03-04 2 views
0

이전에는 사용하던 테이블 반환 함수가 있지만 더 이상은 아니거나 적어도 많은 시간이 걸립니다.테이블 반환 함수

유일한 변경 사항은 쿼리가 읽는 테이블에있는 데이터의 양입니다.

이것은 기능 코드입니다.

ALTER FUNCTION [dbo].[SUPERVISOR_NOMINA2] (@iniDATE DATE,@endDATE DATE) 
RETURNS @TABLA TABLE (
    [ID]    INT   NOT NULL PRIMARY KEY CLUSTERED 
    ,[EFEC]    FLOAT  NOT NULL 
    ,[TOP]    FLOAT  NOT NULL 
    ,[EXTRA]   FLOAT  NOT NULL 
    ,[DEUDA]   FLOAT  NOT NULL 
    ) 

AS 
BEGIN 

    INSERT INTO @tempTABLE 

    /*------RUN FROM HERE TO TEST------- 
    DECLARE @iniDATE DATE,@endDATE DATE 
    SET @iniDATE = '2013-02-20' 
    --*/ 

    SELECT 
    SOURCE.[ID],SOURCE.[NAME],SOURCE.[CAMPAIGN],[SUPERVISOR],[FLOOR MANAGER],[LAST LOGON],[EFEC],[TOP] 
     ,[HR+] AS EXTRA 
     ,CASE 
      WHEN [DIF] >= 0 THEN 0 
      ELSE [DIF] 
     END AS DEUDA 
    FROM (
    SELECT 
      NM.[ID] 
      ,NM.[NAME] 
      ,NM.[CAMPAIGN] 
      ,NM.[SUPERVISOR] 
      ,SUM(CASE 
      WHEN [ATT ID] > 4 AND [ATT ID] <> 7 THEN '0' 
      ELSE ROUND([EFEC],2) 
      END) AS [EFEC] 
      ,SUM(CASE 
      WHEN [ATT ID] > 4 AND [ATT ID] <> 7 THEN '0' 
      ELSE [TOP] 
      END) AS [TOP] 
      ,SUM(CASE 
      WHEN [ATT ID] > 4 AND [ATT ID] <> 7 THEN '0' 
      WHEN [EFEC] < [TOP] THEN 0 
      WHEN [TOP]+[EXHR] > [EFEC] THEN ROUND([EFEC]-([TOP]+[EXHR]),0,1) 
      ELSE [EXHR] 
      END) AS [HR+] 
      ,ROUND(SUM(CASE 
      WHEN [ATT ID] > 4 AND [ATT ID] <> 7 THEN '0' 
      WHEN [EFEC] < [TOP] THEN ROUND([EFEC]-[TOP],2) 
      WHEN [TOP]+[EXHR] > [EFEC] THEN ROUND([EFEC]-([TOP]+ROUND([EFEC]-([TOP]+[EXHR]),0,1)),2) 
      ELSE ROUND([EFEC]-([TOP]+[EXHR]),2) 
      END),2) AS [DIF] 

     FROM [WFO].[dbo].[VIEW_NOMINA] NM 
     FULL JOIN [WFO].[dbo].[VIEW_ATTENDANCE] AT ON NM.ID = AT.ID AND NM.DATE = AT.DATE 
     WHERE NM.DATE < CONVERT(DATE,GETDATE()) AND NM.[DATE] BETWEEN @iniDATE AND @endDATE 
     GROUP BY NM.[ID],NM.[NAME],NM.[CAMPAIGN],NM.[SUPERVISOR]) SOURCE 
     LEFT JOIN (
      SELECT [ID],CONVERT(DATE,MAX(DATETIME)) AS [LAST LOGON] 
      FROM [WFO].[dbo].[AGENT-LOGBOOK] 
      GROUP BY [ID] 
    ) LT ON LT.ID = SOURCE.ID 
     LEFT JOIN [WFO].[dbo].[SUPERVISORS] SP ON SP.NAME = SOURCE.SUPERVISOR 
     ORDER BY [NAME] 
RETURN 
END 

재미있는 부분은 삽입 문 바로 뒤에있는 쿼리와 반환 문 앞에 쿼리를 실행하면 초 단위로 작동한다는 것입니다.

내가 뭘 잘못하고 있다고 생각하니?

+1

WHEN [ATT ID] > 4 AND [ATT ID] <> 7 THEN '0' 

같은 모든 라인을 변경하는 것은 우리에게 실행 계획을 제시해주십시오. 나중에 참조 할 수 있도록 데이터베이스 성능에 대한 질문에 포함하고자하는 실행 계획을 작성하십시오. –

답변

0

한 가지 문제가 당신의 where 절에서이 SQL이다 :

NM.DATE < CONVERT(DATE,GETDATE()) 

나는 CONVERT이 경우에 필요하지 않습니다 확신 사실 게다가, 이러한 방식으로 기능을 사용하여 자주 인덱스 있도록 할 수 있습니다 당신이 가진 장소는 사용되지 않습니다.

+0

나는 그 진술을 삭제했지만 여전히 좋지 않습니다. – ezamora

0

심지어 실행됩니까? 많은 CASE 명령문은 한 케이스의 문자를 다른 문자의 숫자로 리턴합니다. 이것은 실패해야합니다. 이

WHEN [ATT ID] > 4 AND [ATT ID] <> 7 THEN 0 
+0

그것은 쿼리를 실행할 때 수행하지만 함수를 실행하려고 시도하지 않습니다. 나는 네가 한 말을 바꾸려고 노력했다. – ezamora

관련 문제