2013-03-04 33 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

請告訴我們你的執行計劃。爲了將來的參考,執行計劃中您希望包含在關於數據庫性能的任何問題中。 – 2013-03-04 21:32:10

回答

0

一個可能的問題是這樣的SQL你的where子句中:

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

除了這個事實,我敢肯定的CONVERT在這種情況下沒有必要的,以這種方式使用功能往往能這麼指標你有沒有使用。

+0

我刪除了該陳述,仍然不好。 – ezamora 2013-03-04 22:14:22

0

這是否甚至運行?許多CASE語句爲另一種情況返回一個字符的字符。這應該會失敗。將如下

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

所有行這個

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

它在我運行查詢時會執行,但不會在我嘗試運行該函數時執行。我試着改變你說的話,但仍然一樣。 – ezamora 2013-03-04 22:13:08